Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по транзакциям в назначенных заданиях (job)
|
|||
|---|---|---|---|
|
#18+
Неожиданно обнаружила, что если процедура вызывается при помощи назначенного задания, то она не выполняется в единой транзакции (впечатление, что стоит автокоммит на каждую строчку). Поясню на примере. У нас стоит DB2 10 под z/os. Создадим тестовую таблицу: Код: sql 1. 2. 3. 4. 5. Напишем простейшую процедуру, которая делает 2 действия: Код: sql 1. 2. 3. Если просто запустить процедуру, то она отвалится по exception'у и ничего вставлено не будет. Вешаем задание на запуск этой процедуры через SYSPROC.ADMIN_TASK_ADD. И видим, что оно также выполняется с ошибкой, НО - значение 4 в таблицу будет вставлено!!! Вопрос: чем это объясняется и как лечится? Какие параметры можно выставить? Процедура отрабатывает корректно, если вручную перехватывать ошибку и делать Rollback к Savepoint в начале процедуры, но это же какая-то совсем странная реализация, не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2012, 11:52 |
|
||
|
Вопрос по транзакциям в назначенных заданиях (job)
|
|||
|---|---|---|---|
|
#18+
Не знаю насчёт for z/os, а для for LUW для блоков есть варианты begin atomic...end и begin...end. В случае ошибки все выражения будут откачены/откатаны/отроллбачены в первом случае, только ошибочное - во втором. (Для процедуры вы можете разместить begin atomic...end внутри begin...end). К автокоммиту это не имеет отношения. А имеет отношение - сделан ли commit либо rollback после вызова вашей процедуры. Видимо, если вы "просто" запускаете процедуру, это "просто" неявно делает rollback (либо всегда, когда нет явного commit'а, либо по обнаружении exception'а), а SYSPROC.ADMIN_TASK_ADD всё равно делает commit. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2012, 13:31 |
|
||
|
Вопрос по транзакциям в назначенных заданиях (job)
|
|||
|---|---|---|---|
|
#18+
Спасибо, но насколько я понимаю, в z/os нет begin atomic в процедурах, только в триггерах :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2012, 17:44 |
|
||
|
Вопрос по транзакциям в назначенных заданиях (job)
|
|||
|---|---|---|---|
|
#18+
Правильно ли я понимаю, что при включенном автокоммите в DB2 процедуры выполняются в неявной транзакции, началом которой считается первый оператор, а концом - последний или же явный commit/rollback? Почему это не работает при их выполнении с помощью назначенного задания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2012, 10:53 |
|
||
|
Вопрос по транзакциям в назначенных заданиях (job)
|
|||
|---|---|---|---|
|
#18+
K.T.V., Автокоммит - опция клиента, а не базы - Command Line Processor'а, ещё кого. Это не атрибут базы/сервера. Шедулер (считай клиент, таски выполняющий), вообще выбора не предоставляет. По крайней мере так в DB2 for LUW. Похоже, DB2 CLP в режиме автокоммита после неудачной операции автоматом делает rollback , что в вашем случае откатывает всё, сделанное процедурой. При отключённом в CLP автокоммите транзакция может начаться и раньше вызова процедуры (с момента первого запроса после последнего коммита). CLP при этом вообще никаких коммитов/откатов сам не делает => если вывались в середине процедуры и содержимое не помечено как атомарное, то всё, выполненное до ошибочного statement'а может быть как зафиксировано, так и откачено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2012, 15:58 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=37651414&tid=1601939]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 161ms |

| 0 / 0 |
