【发布时间】:2015-10-07 18:54:44
【问题描述】:
今天我在排查一个死锁案例,发现了一个很奇怪的案例(至少我觉得很奇怪)。我有两个并发语句(UPDATE 和SELECT),它们导致了死锁情况。那里没有问题。下面是描述我的情况的死锁图:
困扰我的是SELECT 持有的锁类型。为什么是SIU(与实习生更新共享),而不是S(共享)或IS(意图共享)锁定?
我在 MSDN 论坛上找到了一个post,它解释了非常相似的案例:
Profiler 显示所有会话的当前累积锁定。在我将死锁事件导出到 xdl 文件并在文本编辑器中打开它后,我发现选择数据的进程具有 S 锁,而更新数据的进程具有 IU 锁(并且想要 IX 锁)。并且资源是 SIU 锁定的 (S+IU)。
对我来说这听起来像(而且没有任何意义):
SELECT 有 SIU 锁,因为其他会话有执行 UPDATE 的意图
谁能解释一下为什么SELECT 持有SIU 锁?
更新: select 语句由 EF 6.1.2 自动生成; update 语句是一个存储过程。
【问题讨论】:
-
这是多语句交易吗?请注意,您的更新不能使用任何索引。可能不是你想要的。
-
放大显示它有一个嵌套的子查询。
-
什么是事务隔离级别?您可以在死锁图的 xml 中找到它。
-
这里可能存在类似问题? dba.stackexchange.com/questions/89460/…
-
@davidoff:信任但验证。该查询看起来像是由一个 orm 生成的,并且我处理过的至少一个 orm 有助于将其设置为可序列化。
标签: sql-server tsql sql-server-2012 deadlock