最近,当他们想要更新数据库上的某些记录时,我们的用户有时会遇到超时失效错误。(我认为数据库中出现类似死锁的情况)
我们的DataBase是SQL Server 2008 R2
,我们的应用程序首先由EF5代码开发。
今天我读了一篇关于在SQL Server中使用READ_COMMITTED_SNAPSHOT
选项的文章,我认为这个选项可以帮助我们防止DB中的死锁。
根据该文章,它有两个步骤:
1-在DB中激活READ_COMMITTED_SNAPSHOT
ALTER DATABASE testDatabase SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE testDatabase SET READ_COMMITTED_SNAPSHOT ON;
2-在代码中使用READ_COMMITTED_SNAPSHOT
选项:
using (var transactionScope =
new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel= IsolationLevel.Snapshot }))
{
// update some tables using entity framework
context.SaveChanges();
transactionScope.Complete();
}
此示例使用TransactionScop
语句。但我们没有使用TransactionScop
来管理Transactions
。例如,我们在模型中有继承,当我们调用.SaveChange()
时,EF
创建并管理Transaction
本身。
有没有办法在不使用READ_COMMITTED_SNAPSHOT
声明的情况下使用TransactionScop
?
答案 0 :(得分:4)
READ_COMMITTED_SNAPSHOT
和SNAPSHOT_ISOLATION
不是一回事。在数据库上启用READ_COMMITTED_SNAPSHOT
后,所有READ COMMITTED
个事务都将使用它。
SNAPSHOT_ISOLATION
是一个完全不同的隔离级别,需要像你一样在代码中调出。
进一步阅读: https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx
答案 1 :(得分:0)
您可以在没有TransactionScope
的情况下开始投放,为此,请使用Connection
的{{1}}属性:
DbContext