Триггер в сочетании с транзакцией

25

Предположим, у нас следующая ситуация:

У нас есть таблица (скажем Table_A), на которой есть триггер INSERT. Задание триггера заключается в обновлении некоторых строк на table_Bоснове вставленных значений в table_A.

Теперь все нормально, когда мы просто вставляем строку в таблицу, но как насчет ситуаций, когда мы вставляем данные через транзакцию? Будет ли триггер ждать, пока все операторы транзакций будут успешно выполнены, или он будет запущен в тот момент, когда он распознает вставку ?. Если триггер срабатывает немедленно, когда он распознает первую вставку, что произойдет, если транзакция завершится неудачей в последней строке? Есть ли какой-то механизм для такой ситуации?

veljasije
источник

Ответы:

37

Вставка всегда в транзакции.

Если у вас нет явного BEGIN TRAN ... COMMITили, SET IMPLICIT_TRANSACTIONS ONто оператор выполняется как автономная транзакция автоматической фиксации .

Триггер всегда является частью транзакции для действия, которое запускает триггер. Если в триггере возникает ошибка, которая вызывает откат транзакции, то действие запуска будет также отменено.

Триггеры неявно имеют XACT_ABORTна. Ошибка при включении этого параметра автоматически приведет к откату транзакции (за исключением ошибок, возникших в коде с RAISERRORоператором).

Мартин Смит
источник