我在这里描述了这个问题: Deadlock under ReadCommited IL 并得到了答案:
So a deadlock can occur when running SELECTs because the transaction running
those selects had acquired write locks before running the SELECT.
好的,那么我该怎么做才能摆脱这个?有一些常见类型的死锁可以通过添加覆盖索引或更改sql命令文本的更改隔离级别,使用表提示等来解决,但我想不出适合我的情况的解决方案。
似乎这是导致死锁的最常见和最容易的原因:
所以这主要是并行问题,也可能是业务逻辑。
如果将锁应用于行,也许我能够避免死锁,但似乎页面中有多个行锁,然后发生锁升级,然后我将整个页锁定。
你有什么建议?禁用锁升级?我可以在本地进行1次交易吗? 或者可能应用一些表提示(WITH ROWLOCK)或其他东西...... idk
现在不能选择将隔离级别更改为快照(或其他类型)。 感谢。
答案 0 :(得分:1)
修复死锁主要是针对所考虑的特定事务的特定任务。几乎没有一般性的建议(除了启用你不能做的快照隔离)。
但是,有一种模式可以作为标准修复:使用正确的锁定模式以正确的顺序获取所有必要的锁定。这可能意味着选择WITH (UPDLOCK, ROWLOCK, HOLDLOCK)
以主动锁定行。
我没有看到锁升级成为问题,因为它需要非常大量的锁来启动。当然这可能是原因,但最常见的是,行锁足以触发死锁。