发生数据库死锁,但为什么呢?

时间:2013-02-05 22:40:05

标签: c# sql-server multithreading transactions deadlock

我无法想象这一点,我想我已经盯着自己的问题了。

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

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

  1. 开始交易(ReadCommitted)
    1. 从MyTable1中选择 count(*),其中...(比较没有索引的列,因此可能会导致完整的表格扫描)
    2. 插入MyTable1 ......
    3. 插入MyTable2 ......
    4. 重复a,b,c 100次。
  2. 提交交易
  3. 所使用的数据对于每个线程都是唯一的,因此一个线程不能创建与另一个线程相同的插入。

    这会导致死锁。

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

    但是我似乎无法解决这会导致死锁的问题,而且我很确定这是一个死锁的教科书示例。

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

2 个答案:

答案 0 :(得分:1)

这样想:

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

下一次迭代......

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

死锁

答案 1 :(得分:0)

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

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

感谢您的所有帮助:)。