【问题标题】:sql deadlock in transaction scope事务范围内的sql死锁
【发布时间】:2013-04-25 17:24:01
【问题描述】:

我有交易范围,我想:

using (var scope = new TransactionScope())
{
   1) Insert row into table1
   2) Select rows from table1  (incuding inserted row in step 1)
   3) Insert another row into table1 
   4) Select rows from table1 (incuding inserted row in step 1 and 3)
}

有没有机会在这些操作中出现 sql 死锁?我正在使用 Db 工作的实体框架。我不确定。

谢谢,

祝你有美好的一天。

【问题讨论】:

  • 你的意思是'这个例程是否有可能自己生成一个sql死锁',即没有任何其他人访问数据库?还是您的意思是“如果两个(或更多)用户同时运行此例程,是否可能发生 sql 死锁”?
  • 本身就是一个平均死锁。

标签: sql sql-server entity-framework tsql


【解决方案1】:

这应该没有问题。

插入可能会锁定其他用户,甚至锁定自己进行的其他事务,但不会锁定您在相同 Sql 事务中执行任何操作。

【讨论】:

  • 谢谢。那么没有办法在同一个sql事务中死锁吗?
【解决方案2】:

是的,有可能发生死锁。

如果SQL Server 选择将INSERT 操作所需的锁升级到页级或表级并且出现这种情况:

Transaction 1         Transaction 2
INSERT INTO page1
                      INSERT INTO page2
                      INSERT INTO page1
INSERT INTO page2

那么这两个事务将死锁,其中一个必须回滚。

【讨论】:

  • 在我看来,事务范围定义了一个事务。 EF 框架还在插入期间创建了事务。但我在想这个“小”事务将立即提交(并且表将被解锁)。那么到底哪里会有两笔交易的时间呢?谢谢。
  • @Quassnoi 这里只有一笔交易。他的所有查询都在同一个事务范围内同时运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多