最近,我们的用户在更新某些数据库记录时有时会遇到超时过期错误(我认为这类似于数据库死锁)。我们的数据库是SQL Server 2008 R2
,应用程序使用EF5代码优先开发。
今天,我阅读了一篇关于在SQL Server中使用READ_COMMITTED_SNAPSHOT
选项的文章,我认为这个选项可以帮助我们预防数据库死锁。根据该文章,它有两个步骤:
1- 在数据库中启用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();
}
这个示例中使用了TransactionScope
语句。但我们没有使用TransactionScope
来管理Transactions
。例如,我们的模型中有继承关系,当我们调用.SaveChange()
时,EF
会自行创建和管理Transaction
。
有没有办法在不使用TransactionScope
语句的情况下使用READ_COMMITTED_SNAPSHOT
?