我在这里描述了这个问题: 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 命令文本的隔离级别、使用表提示等来解决,但我想不出适合我的情况的解决方案。
似乎这是最常见和最简单的死锁原因:
- 进程A获得资源R1上的锁,进程B获得资源R2上的锁
- 进程A等待资源R2被释放,进程B等待R1
所以这在很大程度上是一个并行问题,也可能是业务逻辑。
如果将锁应用于行,也许我可以避免死锁,但似乎一个页面中有几个行锁,然后发生锁升级,然后我锁定了整个页面。
你有什么建议?禁用锁升级?我可以在本地进行 1 次交易吗?或者也许应用一些表格提示(WITH ROWLOCK)或其他东西...... idk
现在不能选择将隔离级别更改为快照(或其他类型)。谢谢。