私はコードの一部を調べていて、次のことに出くわしました:
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;
});
}
質問:
親トランザクションの分離レベルは「スナップショット」ですが、内部データベースの読み取りは「ReadCommitted」を使用しています。実際のトランザクション分離レベルはどうなりますか?
2 つのタスクがあるとします。タスク 1 は問題なく処理され、コールバック チャネルで WCF クライアントに送信されます。ただし、タスク 2 では例外が発生します。この時点で、親トランザクション スコープ内で実行されたすべてのアクティビティがロールバックされるはずです。しかし、クライアントに到達した WCF コールバック チャネル経由で既に送信された一連のデータをロールバックすることの意味がわかりません。