我在默认的“READ COMMITED”事务下,在平面普通表上有一个简单的简单SQL UPDATE查询引起的一些有趣的死锁。
UPDATE table SET column=@P1 WHERE PK=@P2
列PK
为varchar(11)
,上面有聚簇索引。
桌子上没有触发器或表格关系。
我做了一些检查,发现死锁发生在“PAGE”级别,而不是ROW /记录级别。 然后,我发现对于每个更新查询,它确实需要100(和更多)PAGE锁。 (这对我没有意义,因为我一次更新一行)
有没有办法防止发生死锁?或者,如何在不使用游标的情况下减少单行更新所需的锁数?
-
感谢您的建议。
我曾尝试重建索引几次,填充因子高低。我曾试图让进程更新不同的位置/切片。但没有任何改善或最坏的。
-
我尝试过SQL Server Profiler。我捕获了一些“Lock:Deadlock Chain”和“Lock:Deadlock”, 但没有捕获“死锁图”。双方都在读提交,自动提交模式下进行简单的更新查询。
Lock:Deadlock Chain 17887475 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887476 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438102 265006271 0 0X56AF060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887477 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887478 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426206 265006240 0 0XDE80060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887479 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426206 265006271 0 0XDE80060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887480 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887481 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426066 265006240 0 0X5280060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887482 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426066 265006271 0 0X5280060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887483 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887484 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425614 265006271 0 0X8E7E060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887485 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887486 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426687 265006271 0 0XBF82060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887487 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887488 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425392 265006271 0 0XB07D060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887489 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887491 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887493 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887494 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:435792 265006271 0 0X50A6060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887495 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887496 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438206 265006271 0 0XBEAF060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock 17887497 myuser 0XCD85FBB269700B4AA2F4E8579D118999 209 myserver myuser 2008-11-28 10:16:45.930 1:426206 265006271 myapps 0 0XDE80060001000000000000001B0006 123 27 281 2008-11-28 10:16:46.210 myclient 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971498
答案 0 :(得分:4)
您有2个选项可以减少锁定升级:
1)添加WITH(ROWLOCK)提示,要求sql server采用更精细的粒度锁(您的里程可能会有所不同:
UPDATE表WITH(ROWLOCK)SET column = @ P1 WHERE PK = @ P2;而PK varchar(11),上有一个聚簇索引 它。没有跳跳虎或桌子关系..等等 在桌子上。
2)以随机顺序更新行,这样可以降低将行锁升级为页锁的可能性。
此外,确保该表上的索引是最新的通常可以减少锁定。如果要进行大量插入,可以留下填充因子(90很好)。
答案 1 :(得分:1)
您是否运行了个人资料跟踪?
启动SQL事件探查器并创建添加了以下事件的标准跟踪:
应该提供有关死锁的确切性质的详细信息。
答案 2 :(得分:0)
在正常的,简单的情况下,这种类型的乞求不常见。我的问题是:这笔交易的“另一面”是什么?什么是正在运行并导致此死锁的其他更新语句?我认为,这将是诊断这个问题的关键。老实说,我的钱是另一个,迄今为止身份不明的查询是罪魁祸首。我现在在拉斯维加斯......
答案 3 :(得分:0)
同一个表中的哪些select语句和相同的记录确实在更新语句之前在同一个事务中发生?在这些选择中使用(updlock)锁定提示。
答案 4 :(得分:0)
答案 5 :(得分:0)
我最终必须在存储过程中使用cusror来解决此问题。
但是,PAGE锁定如何发生以及如何解决仍然很有趣。
在Google上进行了一些搜索之后,还有一些人遇到了同样的问题,他们(来自MSDN论坛)建议关闭SQL Server 2005中的并行性,但我没有机会尝试。