我有一个更新SQL Server 2005数据库中的表的应用程序。该应用程序为我的每个区域都有一个线程,这些线程同时运行。
在极少数情况下,我在更新表时遇到SQL Server死锁错误。
最近我想到我应该按地区划分我的桌子。在我看来,问题应该消失,但我不能在我的测试环境中复制这个错误,所以我无法证明它。
有没有人对此有任何想法?
答案 0 :(得分:1)
您需要深入研究锁定的内容以及原因 - 锁是否从行锁升级到页/表锁,或者这是行锁之间的死锁。
从区域性来看,锁定升级可能会以某种方式发挥作用,来自您的帖子的推断是您不希望2个线程接触相同的记录 - 但这并不能阻止他们编辑相同的数据页/表。
就SQL Server 2005而言,锁升级来自行 - >页面 - >表。仅在SQL Server 2008中,分区锁才会进入该升级。
您需要深入了解死锁并捕获死锁图,以了解更多关于遇到死锁的信息。有关MSDN图表的更多信息:http://msdn.microsoft.com/en-us/library/ms188246(v=SQL.90).aspx
答案 1 :(得分:1)
如果没有线程会更新同一行,那么您应该使用with rowlock
提示。如果您已经在使用此提示,则问题是由标准死锁之外的其他问题引起的。 (除了死锁之外的其他事情导致代码运行得如此之慢,引擎会使用死锁消息杀死线程。)