【发布时间】:2019-07-11 22:55:10
【问题描述】:
我在来自 2 个单独的存储过程的这 2 个查询之间遇到了死锁:
1.
UPDATE ord
SET
[Num] = @Num,
[Ref] = @Re,
[Date] = @Date
FROM [Order] ord
INNER JOIN [Orders_Open] oo ON oo.Id = ord.ID
2.
UPDATE oo
SET oo.Name = i.Name,
oo.Email = i.Email,
oo.PostCode = i.PostCode,
FROM Item_Order i
INNER JOIN [Orders_Open] oo ON oo.ID = i.ID
防止发生死锁的最佳方法是什么?我已经研究过在死锁发生之前使用 holdlock 来防止死锁:
例如
UPDATE oo WITH (HOLDLOCK)
SET oo.Name = i.Name,
oo.Email = i.Email,
oo.PostCode = i.PostCode,
FROM Item_Order i
INNER JOIN [Orders_Open] oo ON oo.ID = i.ID
这行得通吗?或者其他人可以就我可以尝试的其他方法提供建议吗?
谢谢
【问题讨论】:
-
你之前在每个SP中是否对同一个事务进行过操作?
-
超过 1 个更新同时触发,命中同一来源?
-
@EzLo 不,只是一个选择语句。交易也是隐含的。它会通过明确表达来解决任何问题吗?
-
我很确定问题是当 UPDATES 触发时,update 1 正在加入您的 oo 表中,该表也在更新中 - 您是否尝试过简单地向 UPDATE 1 脚本添加一个 nolock跟随 INNER JOIN [Orders_Open] oo WITH (NOLOCK) ?
-
@RyanGadsdon,如果您的意思是自动提交(每个语句都是单独事务的默认行为),我不希望显式事务产生不同。隐式事务在执行更新时启动事务,但不会自动提交事务。
标签: sql sql-server deadlock