Bla*_*Man 3 t-sql sql-server database-trigger
我正在尝试查找有关触发器内 RETURN 效果的信息。我能找到的唯一文档是它“释放”触发器。
我问的原因是最近添加的触发器导致了一些死锁问题,即使触发器为空也是如此。
这些示例非常荒谬(为什么要检索刚刚插入的数据),但这就是它的工作方式。生成这些语句的代码非常古老。
“空”触发器的主体
BEGIN
SET NOCOUNT ON;
END
Run Code Online (Sandbox Code Playgroud)
表 1 上启用了空触发器
BEGIN TRANSACTION
INSERT INTO Table1.... -- Table1 becomes locked until transaction is committed
SELECT * FROM Table1 WHERE ID = X... -- deadlock
INSERT INTO Table2...
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
空触发器已禁用
BEGIN TRANSACTION
INSERT INTO Table1.... -- Table1 DOES NOT BECOME LOCKED
SELECT * FROM Table1 WHERE ID = X...
INSERT INTO Table2...
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
在触发器末尾添加 RETURN 会释放锁,从而防止死锁。
这安全吗?我唯一能想到的是如果触发器修改了它所在的表,释放锁可能会导致脏读。
要回答您的问题,是的,在触发器内使用 RETURN 是完全安全的。它通常用在复杂触发器的开始处,以便在没有要处理的行时立即退出。像这样;
IF (@@ROWCOUNT_BIG = 0)
RETURN;
Run Code Online (Sandbox Code Playgroud)
然而,一定还有其他原因导致了僵局。请参阅 Gail Shaw 的优秀博客《SQL Server 死锁示例》,并查看死锁图,看看它是否为您提供了更多有关问题所在的线索。
| 归档时间: |
|
| 查看次数: |
9720 次 |
| 最近记录: |