1

私はコードの一部を調べていて、次のことに出くわしました:

 using(var transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionScopeOptions { IsolationLevel = IsolationLevel.Snapshot })
    {
        List<Task> tasks = new List<Task>();
        try
        {
            // Perform some database operation to read data (These operations are happening with a transaction scope having scopeoption as "Required" and isolationlevel as "ReadCommitted")
           // Filter the data
           // At this point the code already has a reference to a WCF duplex callback
           // Create a List<Task> and a
           foreach(var data in List<SomeData>)
           {
               var task = Task.Factory.StartNew(() => {
                  **(WCF Duplex Callback Instance).Process(data);**
           });
           tasks.Add(task);
         }
       }
       catch(Exception ex)
       {
         // Log exception details
       }

       transactionScope.Complete();

    }

try
{
   Task.WaitAll(tasks);
}
catch(AggregateException ae)
{
    ae.Handle( ex => {
         // log exception details
         return true;
    });
}

質問:

  1. 親トランザクションの分離レベルは「スナップショット」ですが、内部データベースの読み取りは「ReadCommitted」を使用しています。実際のトランザクション分離レベルはどうなりますか?

  2. 2 つのタスクがあるとします。タスク 1 は問題なく処理され、コールバック チャネルで WCF クライアントに送信されます。ただし、タスク 2 では例外が発生します。この時点で、親トランザクション スコープ内で実行されたすべてのアクティビティがロールバックされるはずです。しかし、クライアントに到達した WCF コールバック チャネル経由で既に送信された一連のデータをロールバックすることの意味がわかりません。

4

1 に答える 1

2

1)ネストされたTransactionScopeを意味する場合、MSDNによれば、それらを異なる分離レベルでネストすることはできません:

ネストされた TransactionScope オブジェクトを使用する場合、ネストされたすべてのスコープがアンビエント トランザクションに参加する場合は、まったく同じ分離レベルを使用するように構成する必要があります。ネストされた TransactionScope オブジェクトがアンビエント トランザクションに参加しようとしているにもかかわらず、別の分離レベルが指定されている場合、ArgumentException がスローされます。

ただし、いくつかのストアド プロシージャ、関数を使用している場合、または生の SQL を実行しているだけの場合は、分離レベルを明示的に変更することができ、再度明示的に変更されるまで、その接続に対して設定されたままになります。ただし、TransactionScope オブジェクトには反映されないことに注意してください。

2) これは、リソース マネージャーを介して行われたすべての変更がロールバックされることを意味します。もちろん、データベースにクエリを実行し、チャネルを介して結果を転送するだけの場合は、ロールバックする必要はありませんが、たとえばデータベースを更新する場合、この場合は変更をロールバックする必要があります。

それが役に立てば幸い!

于 2013-06-10T15:36:06.497 に答える