返回触发器内部,安全吗?

时间:2018-05-24 06:41:36

标签: sql-server tsql database-trigger

我正在尝试在触发器中找到有关RETURN效果的信息。我能找到的唯一文件是“释放”触发器。

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会释放锁定,防止死锁。

这样安全吗?我唯一能想到的是,如果触发器将表修改为on,则释放锁定可能会导致脏读。

1 个答案:

答案 0 :(得分:3)

要回答您的问题,是的,在触发器内使用RETURN是完全安全的。如果没有要处理的行,它通常在复杂触发器的开头使用,以立即退出。像这样;

IF (@@ROWCOUNT_BIG = 0)
RETURN;

但是,必然会有其他事情导致死锁。请参阅Gail Shaw的优秀博客SQL Server Deadlocks by Example并查看死锁图,看看它是否能为您提供更多问题的线索。