SQL Server 2008死锁问题

时间:2010-03-31 22:25:37

标签: sql-server tsql deadlock

我遇到了一个死锁问题,我正在努力寻找根本原因......死锁图表明UPDATE语句成为SELECT语句的受害者...... 让我感到困惑的是UPDATE语句试图获取一个从未在update语句中引用的其他表的索引...

这就是我的UPDATE语句的样子......

UPDATE Table set col1 = @P1  where col2 = @P2 

此语句在col2索引上获取了一个X锁定,但也试图获取某个其他表中定义的列的索引,该索引与UPDATE语句无关......

赢得死锁情况的SELECT语句与update语句中的表或索引无关,但尝试在UPDATE语句中获取表上的索引。最终导致DEADLOCK。

2 个答案:

答案 0 :(得分:4)

更新事务/锁定将包括以下内容:

  • 触发器
  • 外键验证(col1是fk?)
  • 检查约束(使用udf在col1上)
  • 索引视图(使用table.col1或table.col2)

任何这些都可能导致明显不相关的表具有锁定

答案 1 :(得分:0)

除了其他优秀的答案之外,还需要考虑的是选择通常会获取共享读锁,这允许一系列选择来维护资源上的共享锁。 update语句可能永远不会被授予独占锁。通常情况下,引擎可以很好地防止这种类型的饥饿,但如果您在事务中使用更新与另一个语句,那么这可能会使问题复杂化。如果是这种情况,请提供有关交易中发生情况的更多详细信息。