4

最近、ユーザーがDB上のレコードを更新したいときに、タイムアウト期限切れエラーが発生することがあります.(DBでデッドロックのようなものが発生すると思います)私たちのデータベースはSQL Server 2008 R2.

今日、SQL Server でのオプションの使用に関する記事を読みましたREAD_COMMITTED_SNAPSHOT。このオプションは、DB のデッドロックを防ぐのに役立つと思います。その記事によると、次の 2 つの手順があります。

1- READ_COMMITTED_SNAPSHOTDBでアクティブ化

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使用するため、なしでトランザクションを開始できます。ConnectionDbContext

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 に答える