首先使用READ_COMMITTED_SNAPSHOT和EF代码5

时间:2013-07-08 14:21:58

标签: c# sql-server-2008 entity-framework transactions database-deadlocks

最近,当他们想要更新数据库上的某些记录时,我们的用户有时会遇到超时失效错误。(我认为数据库中出现类似死锁的情况) 我们的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

2 个答案:

答案 0 :(得分:4)

READ_COMMITTED_SNAPSHOTSNAPSHOT_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