7

データベースにデータを保存するとき、IsolationLevel を Serializable に設定して TransactionScope を使用しました。

TransactionOptions options = new TransactionOptions
        {
            IsolationLevel=IsolationLevel.Serializable
        };


using (var transaction = new TransactionScope(TransactionScopeOption.Required,options))
{
    transation.Complete();
}

実行が終わったら、TransactionScopeIsolationLevel を変更したいと思います。

編集

私が理解しているのは、IsolationLevelがSerializableに設定されている場合、トランザクションが完了した後、接続オブジェクトが閉じられて接続プールに戻り、他のリクエストが到着すると、プールからその接続オブジェクトをフェッチするため、以前のIsolationLevelの影響を受けます。したがって、トランザクションごとに分離レベルをデフォルトに変更したいと考えています。

4

2 に答える 2

6

その通りです。接続をプールに返すときに、分離レベルはリセットされません。これは恐ろしい行動ですが、私たちはそれに立ち往生しています...

次の 2 つの戦略があります。

  1. 戻る前に分離レベルをリセットします。これがあなたのアプローチです。
  2. 分離レベルが保証されるように、常に明示的なトランザクション (または TransactionScope) との接続を使用してください。

後者を行うことをお勧めします。

(1) を実行したい場合は、 を閉じた後に分離レベルを変更するだけでTransactionScope済みますが、これは接続オブジェクトで行う必要があります。例:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    using (var transaction = new TransactionScope(TransactionScopeOption.Required,options))
    {
        connection.Open(); //open inside of scope so that the conn enlists itself
        transation.Complete();
    }
    //conn is still open but without transaction
    conn.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL XXX"); //pseudo-code
} //return to pool

これはうまくいきますか?

于 2013-02-19T12:47:05.373 に答える