1

トランザクションでは、次のものがあります。これMyEntitiesは私のコンテキストです:

TransactionOptions options = new TransactionOptions();
options.Timeout = TimeSpan.FromMinutes(1);
options.IsolationLevel = IsolationLevel.Serializable;

 using(TransactionScope scope =

      new TransactionScope(TransactionScopeOption.Required, options))

{
    //Do something to database table MyEntities.Users

}

分離レベルをシリアライズ可能にするか、コードの他の場所にこのようなものがあるようにします

MyEntities.Users.First(x=>x.name == "test")

using(TrnasactionScope...コード行は、トランザクション スコープが完全に完了するまで待機します。または、トランザクション分離レベルの規則に従うために、そのコード行をステートメントで囲む必要があります。

4

1 に答える 1

5

分離レベル自体は何もしません。重要なのは、データのクエリを開始したときに何が起こるかです。特に、読み取りロックとキー範囲ロックをあちこちに残し始めます。別のクエリがこれらのロックの1つにヒットし、読み取りを行っている場合、それは問題ありません。通常、読み取りロックは互換性があります。他のSPIDの分離レベルも重要です。明らかに、読み取りがコミットされていないSPIDは、進行中の操作を気にしませんが、より高い分離は重要です。

より複雑になり始めるのは、SPIDの1つがデータの書き込みを開始したときです。複数のSPIDが同じデータに対してすでに読み取りロックを持っている場合、デッドロックが発生する可能性があります。

ただし、いいえ。トランザクションスコープは、特に読み取りのみを行っている場合は、他のすべてをブロックしません。それが何をするかについて...それは複雑であり、実際にはケースバイケースでしか分析できません。

于 2012-09-09T19:00:58.113 に答える