2

我无法弄清楚这一点,认为我已经对这个问题视而不见。

我在 MsSql server 2012 上有以下场景。

在 10 个线程(C# + NHibernate)中,我这样做:

  1. 开始事务(ReadCommitted)
    1. Select count(*) from MyTable1 where ... (比较没有索引的列,因此这可能会导致完整的表扫描)
    2. 插入 MyTable1 ...
    3. 插入 MyTable2 ...
    4. 重复 a、b、c 100 次。
  2. 提交事务

每个线程使用的数据都是唯一的,因此一个线程不能创建与另一个线程相同的插入。

这会导致死锁。

如果我使用ReadUncommitted事务,它可以完美地工作,因为根本没有读/写锁。

但我似乎无法理解这如何导致死锁,我很确定这是一个教科书上的死锁示例。

有人可以澄清这如何导致死锁吗?

4

2 回答 2

1

这样想:

  • 线程 (a) 执行步骤 1.1(读取 MyTable1)
  • 线程 (b) 执行步骤 1.1(读取 MyTable1)
  • 线程 (a) 执行步骤 1.2 (Write MyTable1)
  • 线程 (b) 执行步骤 1.2 (Write MyTable1)

下一次迭代...

  • 线程 (a) 尝试执行步骤 1.1,必须等待线程 (b) 提交
  • 线程 (b) 尝试执行步骤 1.1,必须等待线程 (a) 提交

僵局

于 2013-02-05T22:50:00.800 回答
0

原来数据库是为 SnapshotReadComitted 配置的。但我不知道(系统上的neebie)。

一旦我意识到这一点,我就能够解决这个问题:)。

感谢您的所有帮助:)。

于 2013-03-03T16:14:33.163 回答