【发布时间】:2013-07-08 14:21:58
【问题描述】:
最近,我们的用户有时会遇到超时过期错误,当他们想要更新数据库上的某些记录时。(我认为数据库中会出现死锁之类的情况)
我们的DataBase是SQL Server 2008 R2,我们的应用是EF5代码先开发出来的。
今天我读到一篇关于在 SQL Server 中使用READ_COMMITTED_SNAPSHOT 选项的文章,我认为这个选项可以帮助我们防止数据库死锁。
根据那篇文章,它有两个步骤:
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 语句?
【问题讨论】:
-
从我的测试来看,如果你在 TransactionOptions 中设置了 IsolationLevel.Snapshot,它将覆盖数据库设置,事务将在 Snapshot 下执行隔离级别,而不是 ReadCommittedSnapshot
标签: c# sql-server-2008 entity-framework transactions database-deadlocks