两个“先写后读”的序列肯定会死锁。您在帖子中省略了一些“细节”,例如发生死锁的实际资源是什么以及涉及的请求。我们将坐在我们的裤子上,在字里行间阅读,从这样一个记录不充分的帖子中弥补了大部分案例:
- 交叉读写。线程 1 插入带有键 A 的行,然后选择带有键 B 的行。线程 2 插入带有键 B 的行,然后选择带有键 A 的行。执行顺序是 T1(A),T2(B),T1(B)-等待,T2 (A)-死锁。
- 独立读写:T1 插入 A 然后读取 A,T2 插入 B 然后读取 B。关键信息:键上没有索引,因此需要进行表扫描来读取 A 和/或B。执行顺序是 T1 写 A,T2 写 B,T1 读 A,开始扫描,阻塞 T2 在 B 上的 X-lock,T2 读 B,开始扫描,阻塞 T1 在 A 上的 X-lock,死锁。
- 独立优化的写读。对于大多数新手来说,这种情况是最令人困惑的,当适当的访问索引到位但仍然发生死锁时。我已经在Read/Write deadlock中介绍了这种情况,由于不同的索引访问顺序,更新可能会因读取而死锁。不太可能是您的情况,但由于文档如此糟糕,一切皆有可能。
Many many more deadlock scenarios are possible, but we'd enter esoterics or start to extrapolate quite far for the missing info in the OP.
If I'd venture a guess, the most likely case is 2). The case 1) would probably easily be identifier. Case 2) is a bit harder to detect in simple code analysis because it depnds on the physical schema design (index structure).