在MS SQL上的更新查询中减少PAGE级别的死锁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在MS SQL上的更新查询中减少PAGE级别的死锁相关的知识,希望对你有一定的参考价值。
我在默认的“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 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
您有2个选项可以减少锁定升级:
1)添加WITH(ROWLOCK)提示,要求sql server采用更精细的粒度锁(您的里程可能会有所不同:
UPDATE表WITH(ROWLOCK)SET列= @ P1 WHERE PK = @ P2;而PK varchar(11),上面有一个聚簇索引。桌子上没有跳跳虎或桌子关系......等等。
2)以随机顺序更新行,这降低了行锁升级为页锁的可能性。
此外,确保该表上的索引是最新的通常可以减少锁定。如果要进行大量插入,可以留下填充因子(90很好)。
您是否运行了个人资料跟踪?
启动SQL事件探查器并创建添加了以下事件的标准跟踪:
- 锁:死锁图
- 锁:锁:死锁链
- 锁:锁:升级
应该提供详细的死锁的确切性质。
在正常的,简单的情况下,这种类型的乞求不常见。我的问题是:这笔交易的“另一面”是什么?什么是正在运行并导致此死锁的其他更新语句?我认为,这将是诊断这个问题的关键。老实说,我的钱是另一个,迄今为止身份不明的查询是罪魁祸首。我现在在拉斯维加斯......
在更新语句之前,同一个表中的哪些select语句和相同的记录确实发生在同一个事务中?在这些选择中使用(updlock)锁定提示。
你桌上有更新的触发器吗?如果是这样,触发器的动作可能会导致您的死锁。
我最后必须通过在存储过程中使用游标来解决此问题。
但是,PAGE锁定如何发生以及如何解决仍然很有趣。
在Google上进行了一些搜索之后,还有其他一些人遇到了同样的问题,并且他们(来自MSDN论坛)建议关闭SQL Server 2005中的并行性,但我从来没有机会尝试过。
以上是关于在MS SQL上的更新查询中减少PAGE级别的死锁的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server死锁排查经历 -基于SqlProfiler