私はWCFトランザクションの実装を試していますが、非同期トランザクションがWCF4.0でサポートされているかどうかを考え出しました。
たとえば、client \ serviceトランザクションを有効にしたいくつかのサービス操作があります。クライアント側ではTransactionScopeを使用し、トランザクション内でそれらの操作を非同期的に呼び出すタスクを作成します。
この状況では、トランザクションは正しく機能すると思いますよね?
私はWCFトランザクションの実装を試していますが、非同期トランザクションがWCF4.0でサポートされているかどうかを考え出しました。
たとえば、client \ serviceトランザクションを有効にしたいくつかのサービス操作があります。クライアント側ではTransactionScopeを使用し、トランザクション内でそれらの操作を非同期的に呼び出すタスクを作成します。
この状況では、トランザクションは正しく機能すると思いますよね?
作成した Task に OperationContext と Transaction.Current の両方を設定する必要があります。
より具体的には、サービスでは次のようにする必要があります。
public Task ServiceMethod() {
OperationContext context = OperationContext.Current;
Transaction transaction = Transaction.Current;
return Task.Factory.StartNew(() => {
OperationContext.Current = context;
Transaction.Current = transaction;
// your code, doing awesome stuff
}
}
ご想像のとおり、これは繰り返しになるので、ヘルパーを作成することをお勧めします。
私はそれを非常に疑っています。非同期操作を開始している場合、元のトランザクションに参加していないようです。
少しLINQPadテストを書きました
void Main()
{
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
try
{
Transaction.Current.Dump("created");
Task.Factory.StartNew(Test);
scope.Complete();
}
catch (Exception e)
{
Console.WriteLine(e);
}
Thread.Sleep(1000);
}
Console.WriteLine("closed");
Thread.Sleep(5000);
}
public void Test()
{
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
Transaction.Current.Dump("test start"); // null
Thread.Sleep(5000);
Console.WriteLine("done");
Transaction.Current.Dump("test end"); // null
}
}