【问题标题】:TransactionScope unintentionally locks parts of the databaseTransactionScope 无意中锁定了部分数据库
【发布时间】:2014-02-25 07:11:46
【问题描述】:

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

今天,在调试导入过程时,我的代码在事务处理过程中因异常而停止。几乎立即我开始收到系统中用户查询失败的报告。不知何故,我将我的操作与它联系起来,点击继续,突然查询又开始工作了。

简而言之,我认为我设置交易的方式是造成这种情况的原因,但我不太了解它的影响,无法解决它。

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

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

【问题讨论】:

    标签: c# sql transactions


    【解决方案1】:

    它似乎在作用域处于活动状态或“挂起”时锁定了数据库

    给定范围内的线程是否正在运行并不重要。不过,您是正确的,因为活动事务可以持有锁。

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

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

    如果您使用的是 SQL Server,您可能应该研究使用SNAPSHOT 隔离来读取事务。这可以快速而全面地解决阻塞问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多