我遇到了一个死锁问题,我正在努力寻找根本原因......死锁图表明UPDATE语句成为SELECT语句的受害者...... 让我感到困惑的是UPDATE语句试图获取一个从未在update语句中引用的其他表的索引...
这就是我的UPDATE语句的样子......
UPDATE Table set col1 = @P1 where col2 = @P2
此语句在col2索引上获取了一个X锁定,但也试图获取某个其他表中定义的列的索引,该索引与UPDATE语句无关......
赢得死锁情况的SELECT语句与update语句中的表或索引无关,但尝试在UPDATE语句中获取表上的索引。最终导致DEADLOCK。
答案 0 :(得分:4)
更新事务/锁定将包括以下内容:
任何这些都可能导致明显不相关的表具有锁定
答案 1 :(得分:0)
除了其他优秀的答案之外,还需要考虑的是选择通常会获取共享读锁,这允许一系列选择来维护资源上的共享锁。 update语句可能永远不会被授予独占锁。通常情况下,引擎可以很好地防止这种类型的饥饿,但如果您在事务中使用更新与另一个语句,那么这可能会使问题复杂化。如果是这种情况,请提供有关交易中发生情况的更多详细信息。