Страница 1 из 3
Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 10:04
Александр
ситуация такая
есть номер (в атрибуте)
есть действие которое прибавляет к этому номеру 1
проблема в том что пару раз сталкивались с тем что два юзера одновременно с разностью в пол секунды запускали это действие и получали одинаковый номер - что не совсем интересно спасал только 'хвост' id юзера из базы - иначе-бы не разошлись
вот собственно и вопрос как заблокировать/поставить на ожидание действие (или его часть) для всех если оно уже кем то запущено???
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 10:27
Anderyt
мы для уменьшения вероятности одинаковых номеров поступили следующим образом.
действие запускается, работает над чем то, а когда дело доходит до получения порядкового номера - получает его от определенного объекта и ТУТ ЖЕ обновляет счетчик, увеличивая его на 1. для этого используем update().
вероятность одинаковых номеров стала намного меньше (но они каикм то образом все таки встречаются, но ОЧЕНЬ-ОЧЕНЬ редко).
один из минусов - если отменить действие, которое уже успело получить свой порядковый номер, то номер пропадает, то есть выпадает из цепочки. какое то время объясняли юзерам, что это не страшно, вроде в итоге объяснили.
хотя конечно можно брать номер на шаге, после которого уже сложно отменить действие (когда например остались только автоматические шаги).. тогда и вероятность пропусков тоже уменьшится..
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 10:36
Александр
номер ставим на последнем шаге вместе с Update
читаем правда на предпоследнем
....
может шаг все-же является 'изолированной' (однозадачной) конструкцией???
попробую 2 in 1
к сожалению (к счастью) у нас это тоже случалось крайне редко - 2-3 раза за всю историю
так что результат увижу (если увижу) не скоро
ps
а может попросить добавить функции под это дело??? для блокировки шага/шагов?
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 11:54
Anderyt
да кто его знает..
тоже ломал голову, как такое может быть, что одинаковые номера все же появлялись..
раньше было без update - вот была веселуха!

если 2-е действие запустить, когда первое еще не выполнено, то они схватывают один и тот же номер и используют его

но с update вроде стало намного правильнее..
думаю, можно стремиться к приближению attribget, attribset и update друг к другу, чтобы между ними было как можно меньше времени (в одном шаге хотя бы).. надеясь на транзакционность работы сервера БД можно надеяться, что совсем одновременно данные не смогут записаться...
но с другой стороны.. надежнее было бы рассматривать получение номера, увеличение счетчика и обновление счетчика как одну транзакцию.. вот тогда было бы да..
сейчас вроде шаг с тремя функциями не моежт считаться одной транзакцией...
вот блин... в такие моменты я невольно вспоминаю форум Касперского.. там пользователи так же задают вопросы, думают, обсуждают решение... но там время от времени в беседу включаются сотрудники Касперского..
а здесь почему не так???
гадаем тут что то... как да как...

Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 12:10
Александр
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 12:28
Anderyt
Александр писал(а):а что гадать техподдержка здесь не отвечает
дак вот это и плохо..
я конечно догадываюсь, что других проблем хватает..
но это смотря как смотреть на ЭТУ проблему.
если просто как общение на приближенные к Лоции темы - то наверное на самом деле Николай Викторович прав, когда грозится премии лишить..
но если осуществлять здесь техподдержку - это совсем другое дело..
то ли в письмах одно и тоже всем рассказывать и показывать, то ли один раз на форуме все разжевать и потом пусть народ сам ищет (или хотя бы ссылки кидать в ответ)..
и кроме того, ведь письма не все пишут.. кто нить наверное просто сидит, бьется и корпит над Лоцией, и ругает ее про себя, типа "непонятная, сложная и все такое", а все потому, что не знает, как ей пользоваться.. а зачем нужны такие клиенты с такой антирекламой? лучше их переубедить, чтобы по-нормальному рекламировали..

Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 13:12
Admin_PLM_Board
Господа, если вы хотите получать ответы на вопросы по технической поддержке, следует отправлять их по электронной почте.
Ещё раз уточняем, что официальная техподдержка в форуме не отвечает. Форум служит для общения пользователей.
Anderyt писал(а):и кроме того, ведь письма не все пишут.. кто нить наверное просто сидит, бьется и корпит над Лоцией, и ругает ее про себя, типа "непонятная, сложная и все такое", а все потому, что не знает, как ей пользоваться.. а зачем нужны такие клиенты с такой антирекламой? лучше их переубедить, чтобы по-нормальному рекламировали..

Необходимые дополнительные разъяснение относительно "антирекламы".
Как вы знаете, мы - в отличие от наших коллег из некоторых других компаний-разработчиков - не удаляем критические замечания из сообщений на этом форуме. Более того, мы не удаляем критические замечания не только пользователей, но и наших партнёров, хотя они и несколько нарушают иной раз своими высказываниями правила деловой этики.
Но если человек не пишет в техподдержку, а потом начинает ругаться на форуме, что "всё плохо", - наверное, это не очень правильно. Также, вероятно, не очень корректно сначала получать помощь от техподдержки, а потом критиковать её, вырывая фразы и события из контекста. Так что необоснованные замечания и ругань мы будем удалять.
Разумеется, нам не хотелось бы, чтобы форум превращался в "стену плача". Но если вы настаиваете, мы легко пересмотрим нашу политику в этой части. И будут у нас публиковаться только "позитивные" сообщения. 
И ещё, мы пока не готовы предоставлять бесплатную техническую поддержку через форум лицам, использующим наше ПО без лицензии. Надеемся на ваше понимание.
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 13:20
Юрий
Выход из данной ситуации такой - создать свою табличку и в ней хранить значения
счетчиков. При считывании значения делать это командой SQL с установкой блокировки
наращивать значение и отпускать таблицу.
При таком подходе если кто-то в момент установленной блокировки попытается
считать значение - он будет ожидать конца блокировки, и только после этого получит значение.
В таком варианте вообще невозможно получить два одинаковых номера.
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 13:30
Александр
вот эту бы блокировку и вынести в виде пары функций Party - для шага или действия в целом
....
неохота опять в SQL залезать

и так уже много своих xp и видов создали

теперь уже избавляемся от них понемногу... функционала Лоции достаточно на 90% наших задач, в остальном - лучше изменим свою структуру данных

и выдвинем пару предложений на развитие
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 13:44
Юрий
Если вы хотите заблокировать действие - это еще проще:
Для этого нам необходимо создать общую временную таблицу во время запуска действия.
1. при запуске действия проверяем есть ли таблица, если нет создаем ее (таблица вида ##имя MSSQL)
2. далее проверяем есть ли в ней признак что это действие необходимо блокировать, если есть - зацикливаемся
до пропадания данного признака.
Далее добавляем этот признак и делаем свои действия. Перед выходом из действия
убираем признак.
Признак может быть строкой типа "счетчик № 1" или другой, по вкусу.
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 13:49
Юрий
Александр писал(а):вот эту бы блокировку и вынести в виде пары функций Party - для шага или действия в целом
....
Если блокировать атрибуты Лоции - повиснет она у всех...
Александр писал(а):лучше изменим свою структуру данных

и выдвинем пару предложений на развитие
Вот я и предлагаю свою структуру. А реализацию предложений для развития можно и не дождаться...

Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 13:59
Александр
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 14:45
Anderyt
Юрий, а нельзя сделать примерно то же самое, с блокировкой и зацикливанием, но силами самого действия, без использования временных таблиц и всего остального богатства сервера?

Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 14:56
Юрий
Необходима общая ячейка для флага блокировки, если предположить
что мы делаем это силами действия, то возникает аналогичная проблема, так как контейнером
флага будет атрибут и скорость срабатывания будет недостаточно быстрой.
Для этого нам нужна временная общая таблица, потому что время записи значения в эту таблицу
очень мало, что сводит практически на нет возможность одновременной записи.
В данной реализации зацикливается именно действие. А SQL мы используем только для создания
временной таблицы, проверки ее существования и проверки блокировки(проверки нахождения в этой таблице
интересующей нас записи), а все остальное штатными средствами действия.
Re: Как можно блокировать действие или шаг действия?
Добавлено: 17 дек 2008, 14:59
Александр
а можно из действия проверить запущено ли это действие другими?? и если да то подождать в самом действии запуская запросы на проверку занятости?
экземпляр действия говорит...
типа - 'меня запускают - а могу ли я запуститься или стоит подождать'

циклическая ссылка на самого себя или на экземпляр...ы