我想不通这一点,以为我对这个问题视而不见。

我在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)提交


僵局

08-17 16:01