4

最近,我们的用户有时会遇到超时过期错误,当他们想要更新数据库上的某些记录时。(我认为数据库中发生了死锁之类的事情)我们的数据库是SQL Server 2008 R2,我们的应用程序首先由 EF5 代码开发。

今天我读了一篇关于READ_COMMITTED_SNAPSHOT在 SQL Server 中使用选项的文章,我认为这个选项可以帮助我们防止数据库中的死锁。根据那篇文章,它有两个步骤:

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();
}

此示例,使用的TransactionScop语句。但我们没有TransactionScop用于管理Transactions. 例如,我们的模型中有继承,当我们调用时.SaveChange()EF创建和管理Transaction自己。

READ_COMMITTED_SNAPSHOT没有不使用TransactionScop语句的方法使用?

4

2 回答 2

6

READ_COMMITTED_SNAPSHOTSNAPSHOT_ISOLATION不是一回事。READ_COMMITTED_SNAPSHOT在数据库上启用后,所有READ COMMITTED事务都将使用它。

SNAPSHOT_ISOLATION是一个完全不同的隔离级别,需要像你正在做的那样在代码中调用。

进一步阅读: https ://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx

于 2015-06-24T14:45:25.080 回答
0

您可以在没有 的情况下开始交易TransactionScope,为此请使用 的Connection属性DbContext

public static DbTransaction BeginTransaction(this DbContext context, IsolationLevel isolationLevel)
{
    if (context.Database.Connection.State != ConnectionState.Open)
        context.Database.Connection.Open();
    return context.Database.Connection.BeginTransaction(isolationLevel);
}
于 2013-07-08T14:58:25.680 回答