在MS SQL上的更新查询中减少PAGE级别的死锁

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在MS SQL上的更新查询中减少PAGE级别的死锁相关的知识,希望对你有一定的参考价值。

我在默认的“READ COMMITED”事务下,在平坦的普通表上有一个简单的SQL UPDATE查询引起的一些有趣的死锁。

UPDATE table SET column=@P1 WHERE PK=@P2

PKvarchar(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

在执行读取/更新的 MS SQL 存储过程上获取死锁(放置代码来处理死锁)

基于另一个查询的 MS Access SQL 更新查询

怎么避免mysql死锁

30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

30分钟全面解析-SQL事务+隔离级别+阻塞+死锁