c# - TransactionScope 无意中锁定了部分数据库

标签 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
                }
            }

最佳答案

it appears to be locking the database while the scope is active or "hung"

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

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

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

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

关于c# - TransactionScope 无意中锁定了部分数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998174/

相关文章:

c# - 使用 StackExchange.Redis 超时异常的原因可能是什么?

sql - "Error: Unexpected, Please Try Again"与 GoogleBigQuery JOIN

java - 如何进行非事务性 Spring 测试

c# - 如何通过 Controller 返回另一个 Controller 的部分 View ?

c# - C#获取数组的商和余数

mysql - 将表的更新历史记录存储在另一个表中的过程

java - HibernateTemplate 回退到自动提交,在哪里?

java - Apache Kafka 是否能够处理事务?

c# - 将 LINQPAD 连接到 Azure 存储

mysql - 根据不同的列选择唯一的 GROUP_CONCAT-ed 行