ВЕРНУТЬСЯ в триггер, безопасно? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь найти информацию об эффектах ВОЗВРАТА внутри триггера.Единственная документация, которую я могу найти, это то, что он «отпускает» триггер.

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это безопасно?Единственное, о чем я могу думать, это то, что если триггер изменяет свою таблицу, снятие блокировки может привести к неправильному чтению.

1 Ответ

0 голосов
/ 24 мая 2018

Чтобы ответить на ваш вопрос, да, совершенно безопасно использовать RETURN внутри триггера.Он часто используется в начале сложных триггеров для немедленного выхода, если нет строк для обработки.Вот так:

IF (@@ROWCOUNT_BIG = 0)
RETURN;

Однако должно быть что-то еще, что может привести к тупику.См. Великолепный блог Гейл Шоу Взаимоблокировки SQL Server на примере и посмотрите на график взаимоблокировок, чтобы увидеть, дает ли он еще некоторые подсказки, где может быть проблема.

...