【问题标题】:Why SELECT can have SIU lock (SQL Server 2012)?为什么 SELECT 可以有 SIU 锁(SQL Server 2012)?
【发布时间】:2015-10-07 18:54:44
【问题描述】:

今天我在排查一个死锁案例,发现了一个很奇怪的案例(至少我觉得很奇怪)。我有两个并发语句(UPDATESELECT),它们导致了死锁情况。那里没有问题。下面是描述我的情况的死锁图:

困扰我的是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


【解决方案1】:

我认为会证明在同一事务下执行了 DML。我知道你说情况并非如此,但我真的不明白选择如何获取写锁。

附加分析器并捕获所有语句和事务操作TM 事件)。也许您会发现在同一个会话和事务中发生的事情比您预期的要多。

提交这个猜测作为答案,因为它似乎很可能是解决方案。

【讨论】:

  • 如果“使用的日志”不为零会很好,那么我们可以确定一定是这种情况。
猜你喜欢
  • 2018-05-22
  • 2023-03-04
  • 1970-01-01
  • 2016-06-13
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2019-08-08
相关资源
最近更新 更多