我想不通这一点,以为我对这个问题视而不见。
我在MsSql服务器2012年有以下情况。
在10个线程(C#+ NHibernate)中,我这样做:
开始交易(ReadCommitted)
从MyTable1中选择count(*),其中...(比较没有索引的列,因此可能会引起完整的表扫描)
插入MyTable1 ...
插入MyTable2 ...
重复a,b,c 100次。
提交交易
每个线程使用的数据是唯一的,因此一个线程无法创建与另一个线程相同的插入。
这将导致死锁。
如果我使用ReadUncommitted事务,因为根本没有读/写锁,它可以完美地工作。
但是我似乎无法解决这可能导致死锁的问题,而且我很确定这是教科书中有关死锁的示例。
有人可以弄清楚这会导致死锁吗?
最佳答案
这样想:
线程(a)执行步骤1.1(读取MyTable1)
线程(b)执行步骤1.1(读取MyTable1)
线程(a)执行步骤1.2(写入MyTable1)
线程(b)执行步骤1.2(写入MyTable1)
下次迭代...
线程(a)试图执行步骤1.1,必须等待直到线程(b)提交
线程(b)试图执行步骤1.1,必须等待直到线程(a)提交
僵局