如何摆脱僵局

时间:2012-11-13 09:06:42

标签: sql-server transactions parallel-processing deadlock

我在这里描述了这个问题: 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. 处理 A 获得资源锁定 R1 ,流程 B 获取资源锁定 R2
  2. 流程 A 等待资源 R2 发布,流程 B 等待 R1
  3. 所以这主要是并行问题,也可能是业务逻辑。

    如果将锁应用于行,也许我能够避免死锁,但似乎页面中有多个行锁,然后发生锁升级,然后我将整个页锁定。

    你有什么建议?禁用锁升级?我可以在本地进行1次交易吗? 或者可能应用一些表提示(WITH ROWLOCK)或其他东西...... idk

    现在不能选择将隔离级别更改为快照(或其他类型)。 感谢。

1 个答案:

答案 0 :(得分:1)

修复死锁主要是针对所考虑的特定事务的特定任务。几乎没有一般性的建议(除了启用你不能做的快照隔离)。

但是,有一种模式可以作为标准修复:使用正确的锁定模式以正确的顺序获取所有必要的锁定。这可能意味着选择WITH (UPDLOCK, ROWLOCK, HOLDLOCK)以主动锁定行。

我没有看到锁升级成为问题,因为它需要非常大量的锁来启动。当然这可能是原因,但最常见的是,行锁足以触发死锁。