19.03.2009, 11:10 | #1 |
Участник
|
Как принудительно создать блокировку?
Пытаюсь на только что созданной таблице создать блокировку
Но что-то не получается. Создал джобик на update. Захожу в два сеанса. В первом ставлю точку останову на update. Во втором удаляю эту запись. В результате система сначало ждёт пока я проапдейчу, а только потом удаляет. Блокировки не возникает. Может у кого есть какие идеи, как принудительно создать блокировку.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
19.03.2009, 11:22 | #2 |
Модератор
|
1. Откройте транзакцию
2. select forupdate forselocked <- в 4ке новый идентификатор, не помню на память точно, как-то так. 3. Закройте транзакцию С Уважением, Георгий |
|
|
За это сообщение автора поблагодарили: plumbum (1). |
19.03.2009, 11:25 | #3 |
Участник
|
Сорри. Забыл написать.
Ax 3.0 sp4. Oracle 10g.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
19.03.2009, 11:39 | #4 |
Member
|
Цитата:
Сообщение от miklenew
...
В результате система сначало ждёт пока я проапдейчу, а только потом удаляет. Блокировки не возникает. ... Что вы понимаете под блокировкой? Deadlock? Deadlock — это частный случай при работе с блокировками. Обычно блокировки приводят к ожиданиям, как вы написали выше. Deadlock — это конфликт, т.е. когда ожидание ни к чему не приведет. Блокировки возникают даже если к базе подключена только одна сессия.
__________________
С уважением, glibs® |
|
19.03.2009, 11:44 | #5 |
Участник
|
Цитата:
Может я мало ждал? Щас попробую подольше подождать.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
19.03.2009, 11:59 | #6 |
Модератор
|
Хм. Ну, в общем, это и есть блокировка... Т.е. Вы хотите отследить ситуацию, при которой система скажет "погоди! сейчас над этой записью идет работа другого сеанса?".
А вот тут вопрос. Ничего необычного-то для ситемы не возникает в данный момент + возможно зависит от настроек. Попробуй X++: try { ttsBegin; select... ttsCommit; } catch { info (appl.ttslevel()); //Это просто для примера. Возможно, еще что-то в sysException лежит ttsAbort; } Георгий |
|
19.03.2009, 12:23 | #7 |
Member
|
Цитата:
Сообщение от miklenew
Так вот она ждёт и сообщение о блокировке не появляется.
Может я мало ждал? Щас попробую подольше подождать.
__________________
С уважением, glibs® |
|
19.03.2009, 12:36 | #8 |
Участник
|
Цитата:
Цитата:
Тупиковая ситуация. Один или несколько пользователей одновременно блокировали всю таблицу или ее часть.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
19.03.2009, 12:39 | #9 |
Участник
|
Цитата:
Пришёл снял с остановки. И нормально система проапдейтила и удалила запись. Т.е. от времени это не зависит. Тогда вернёмся к первому сообщению "Может у кого есть какие идеи, как принудительно создать блокировку".
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
19.03.2009, 13:02 | #10 |
MCTS
|
Может стоит пойти от обратного... Не допускать таких ситуаций. Как в журналах например.
|
|
19.03.2009, 13:09 | #11 |
Участник
|
Цитата:
Просто мне казалось, что если нужно, то так можно создать тупиковую ситуацию. Ошибался. Считайте, что здесь сугубо теоретический интерес.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
19.03.2009, 13:09 | #12 |
Участник
|
Цитата:
Создаем в таблице две записи. 2 джоба. 1-й джоб: 1. ttsBegin; 2. Блокировка 1-й записи forupdate 3. breakpoint 4. Блокировка 2-й записи forupdate 2-й джоб: 1. ttsBegin; 2. Блокировка 2-й записи forupdate 3. breakpoint 4. Блокировка 1-й записи forupdate Запускаем с одной сессии первый джоб, со второй сессии - второй. Она оба остановятся на п.3 после этого давим F5 в обоих отладчиках и получаем deadlock Правда исключение в аксапте может возникнуть не сразу - зависит от настроек БД |
|
|
За это сообщение автора поблагодарили: miklenew (5). |
19.03.2009, 13:39 | #13 |
Участник
|
Спасибо.
То что нужно. Вот джобы. Может кому пригодяться. X++: static void Job1(Args _args) { Table2 table; ; ttsbegin; select forupdate table where table.Field1 == '1'; breakPoint; table.update(); select forupdate table where table.Field1 == '2'; ttscommit; } X++: static void Job2(Args _args) { Table2 table; ; ttsbegin; select forupdate table where table.Field1 == '2'; breakPoint; table.update(); select forupdate table where table.Field1 == '1'; ttscommit; }
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. Последний раз редактировалось miklenew; 19.03.2009 в 13:48. |
|
Теги |
блокировка |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|