TransactionScope无意中锁定了数据库的某些部分

时间:2014-02-24 20:21:34

标签: c# sql transactions

我有一个很多用户在任何特定时刻使用的Web应用程序。从数据库的角度来看,他们在通过系统时不断地编写和读取任意数量的表中的数据。此外,我们还有许多将数据导入此系统的流程。

今天,在调试导入过程时,我的代码在事务中间停止了异常。几乎立即我开始收到系统中用户查询失败的报告。不知怎的,我把我的行为与它联系起来,点击继续,然后突然查询再次开始工作。

简而言之,我认为我设置交易的方式对此负有责任,但我不能理解它的影响,以便解决它。

我需要一个事务,所以如果出现任何问题我可以回滚它,但它似乎是在范围处于活动状态或“挂起”时锁定数据库。有没有办法可以改变这个以防止我看到的问题?

using (TransactionScope scope = new TransactionScope(
          TransactionScopeOption.Required,
          System.TimeSpan.MaxValue))
            {
                using (var context = new EntityContext())
                {
                     //lots of write operations in here
                }
            }

1 个答案:

答案 0 :(得分:3)

  

它似乎是在范围处于活动状态或“挂起”时锁定数据库

给定范围内的线程是否正在运行并不重要。但是,你是正确的,因为活动事务可以保存锁。

持有哪些锁完全取决于您的工作负载和RDBMS。没有神奇的“不要锁定”选项。锁是有原因的。

鉴于问题没有关于正在运行的查询的信息,架构和RDBMS我只能鼓励您熟悉锁定RDBMS。没有简单的解决方案。

如果您正在使用SQL Server,则应该调查使用SNAPSHOT隔离来读取事务。这可以快速而全面地解决阻塞问题。