Я пытаюсь найти информацию об эффектах ВОЗВРАТА внутри триггера.Единственная документация, которую я могу найти, это то, что он «отпускает» триггер.
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017#optimizing-dml-triggers
Причина, по которой я спрашиваю, состоит в том, что недавно добавленный триггер вызывает некоторые проблемы взаимоблокировки, даже когдатриггер пуст.
Эти примеры довольно бессмысленны (зачем восстанавливать только что вставленные данные), но это так и работает.Код, который генерирует эти операторы, чертовски стар.
Тело "пустого" триггера
BEGIN
SET NOCOUNT ON;
END
Пустой триггер включен в Table1
BEGIN TRANSACTION
INSERT INTO Table1.... -- Table1 becomes locked until transaction is committed
SELECT * FROM Table1 WHERE ID = X... -- deadlock
INSERT INTO Table2...
COMMIT TRANSACTION
Пустой триггер отключен
BEGIN TRANSACTION
INSERT INTO Table1.... -- Table1 DOES NOT BECOME LOCKED
SELECT * FROM Table1 WHERE ID = X...
INSERT INTO Table2...
COMMIT TRANSACTION
Добавление RETURN в конце триггера снимает блокировку, предотвращая взаимоблокировку.
Isэто безопасно?Единственное, о чем я могу думать, это то, что если триггер изменяет свою таблицу, снятие блокировки может привести к неправильному чтению.