web-dev-qa-db-ja.com

Entity Frameworkとトランザクション分離レベル

Entity Framework 4.0を使用しています。ここで、読み取りまたは書き込み中にテーブルへのアクセスを制限する必要があります。おそらくそれはトランザクション分離レベルに関するものです。

それ、どうやったら出来るの?

更新

ここに私が持っているものがあります

using (var db = new MyDb())
{
    using (TransactionScope scope = new TransactionScope())
    {
        var item = db.MyItems.Single(x => x.Id == 5);
        item.Price = 12;
        db.SaveChanges();
        scope.Complete(); 
    }
}

ただし、using (TransactionScope scope内の任意の行にブレークポイントを配置し、そこで停止してから、SQL Server Management Studioに移動し、内部で使用しているテーブルから選択クエリ(または更新も!)を実行するとトランザクション、何らかの理由でエラーが発生していません。しかし、なぜ?トランザクションの実行中にデータを読み取れないようにする必要があります。

24
Alan Coromano

デフォルトでは、トランザクションの IsolationLevel はSerializableです。 Serializableは最高レベルです。他のトランザクションがデータを操作できるようになる前に、トランザクションが完了する必要があります。

次の制限があります。

  • ステートメントは、変更されたが他のトランザクションによってまだコミットされていないデータを読み取ることはできません。
  • 他のトランザクションは、現在のトランザクションが完了するまで、現在のトランザクションによって読み取られたデータを変更できません。
  • 他のトランザクションは、現在のトランザクションが完了するまで、現在のトランザクション内のステートメントによって読み取られたキーの範囲に入るキー値を持つ新しい行を挿入できません。

これは、Entity Frameworkでトランザクションを使用する方法を説明する素晴らしいブログ投稿です。 Entity Frameworkトランザクションスコープの例

更新

Entity Framework 6では、Code Firstを使用して作成されたデータベースのデフォルトのIsolationLevelがREAD_COMMITTED_SNAPSHOTに変更され、潜在的なスケーラビリティと少ないデッドロックが可能になります。 EF 6の今後の仕様 を参照してください

30
Wouter de Kort