今天,我解决了一个死锁问题,发现了一个非常奇怪的情况(至少我觉得很奇怪)。我有两个并发语句(UPDATE和SELECT),它们导致了一个死锁场景。没问题的。下面是描述我的情况的DeadLock图:

困扰我的是SELECT持有的锁的类型。为什么SIU (与实习生更新共享)而不是S (共享)或IS (意图共享)锁?
我在MSDN论坛上找到了一个帖子,这解释了非常类似的情况:
分析器显示来自所有会话的当前累积锁。在我将死锁事件导出到xdl文件并在文本编辑器中打开它之后,我发现选择数据的进程具有S锁,更新数据的进程具有IU锁(并且需要IX锁)。资源是SIU锁定(S+IU)。
对我来说,这听起来像是(而且没有任何意义):
SELECT有SIU锁,因为其他会话有更新的意图
有人能解释一下为什么SELECT持有SIU锁吗?
update : select语句由EF6.1.2自动生成;update语句是一个存储过程。
发布于 2015-07-19 10:36:57
我认为最终会有DML在同一事务下执行。我知道你说的不是这样的,但我真的不明白如何选择可以采取写锁。
附加分析器并捕获所有语句和事务操作( TM事件)。也许您会发现在同一个会话和事务中发生的事情比预期的要多。
提交这个猜测作为答案,因为它似乎很可能是解决方案。
https://stackoverflow.com/questions/31486211
复制相似问题