1

我在这里描述了这个问题: 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

所以这在很大程度上是一个并行问题,也可能是业务逻辑。

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

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

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

4

1 回答 1

1

修复死锁主要是特定于正在考虑的特定事务的任务。几乎没有给出一般性建议(除了启用快照隔离,这是您无法做到的)。

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

我还没有看到锁升级是问题,因为它需要非常多的锁才能启动。当然这可能是原因,但大多数情况下,行锁足以触发死锁。

于 2012-11-13T09:22:14.590 回答