我有一个很多用户在任何特定时刻使用的Web应用程序。从数据库的角度来看,他们在通过系统时不断地编写和读取任意数量的表中的数据。此外,我们还有许多将数据导入此系统的流程。
今天,在调试导入过程时,我的代码在事务中间停止了异常。几乎立即我开始收到系统中用户查询失败的报告。不知怎的,我把我的行为与它联系起来,点击继续,然后突然查询再次开始工作。
简而言之,我认为我设置交易的方式对此负有责任,但我不能理解它的影响,以便解决它。
我需要一个事务,所以如果出现任何问题我可以回滚它,但它似乎是在范围处于活动状态或“挂起”时锁定数据库。有没有办法可以改变这个以防止我看到的问题?
using (TransactionScope scope = new TransactionScope(
TransactionScopeOption.Required,
System.TimeSpan.MaxValue))
{
using (var context = new EntityContext())
{
//lots of write operations in here
}
}
答案 0 :(得分:3)
它似乎是在范围处于活动状态或“挂起”时锁定数据库
给定范围内的线程是否正在运行并不重要。但是,你是正确的,因为活动事务可以保存锁。
持有哪些锁完全取决于您的工作负载和RDBMS。没有神奇的“不要锁定”选项。锁是有原因的。
鉴于问题没有关于正在运行的查询的信息,架构和RDBMS我只能鼓励您熟悉锁定RDBMS。没有简单的解决方案。
如果您正在使用SQL Server,则应该调查使用SNAPSHOT
隔离来读取事务。这可以快速而全面地解决阻塞问题。