sql-server - 在触发器内返回,安全吗?
问题描述
我正在尝试查找有关 RETURN 在触发器内的影响的信息。我能找到的唯一文档是它“释放”了触发器。
我问的原因是最近添加的触发器会导致一些死锁问题,即使触发器是空的。
这些示例非常荒谬(为什么要检索刚刚插入的数据),但这就是它的工作方式。生成这些语句的代码非常陈旧。
“空”触发器的主体
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 会释放锁,防止死锁。
这安全吗?我唯一能想到的是如果触发器修改了它的表,释放锁可能会导致脏读。
解决方案
要回答您的问题,是的,在触发器中使用 RETURN 是完全安全的。如果没有要处理的行,它通常在复杂触发器开始时立即退出。像这样;
IF (@@ROWCOUNT_BIG = 0)
RETURN;
但是,一定还有其他事情会导致死锁。请参阅 Gail Shaw 的优秀博客SQL Server Deadlocks by Example并查看死锁图,看看它是否为您提供了更多关于问题所在的线索。
推荐阅读
- java - 如何从 Maven 的 test/java 文件夹访问主文件夹中的 junit 类?
- heroku - mlab 无法在 heroku cli 中安装
- python - pyuic5 创建一个带有语法错误的 python 文件
- scala - 在火花流中使用 UDF 将 collect_list 列转换为其他数据类型列
- javascript - 这个功能有什么问题
- java - 非法字符 U+200B android
- python - Qt doubleClicked 事件发出两次
- node.js - 如何加载 commonJS 模块的子路径?
- c++ - 如何使用 qt 获得正确的 http 文件长度?
- jquery - 使用 jQuery 在 DOM 中添加事件后单击不起作用