我无法弄清楚这一点,认为我已经对这个问题视而不见。
我在 MsSql server 2012 上有以下场景。
在 10 个线程(C# + NHibernate)中,我这样做:
- 开始事务(ReadCommitted)
- Select count(*) from MyTable1 where ... (比较没有索引的列,因此这可能会导致完整的表扫描)
- 插入 MyTable1 ...
- 插入 MyTable2 ...
- 重复 a、b、c 100 次。
- 提交事务
每个线程使用的数据都是唯一的,因此一个线程不能创建与另一个线程相同的插入。
这会导致死锁。
如果我使用ReadUncommitted事务,它可以完美地工作,因为根本没有读/写锁。
但我似乎无法理解这如何导致死锁,我很确定这是一个教科书上的死锁示例。
有人可以澄清这如何导致死锁吗?