我正在尝试WCF事务实现,并且我想到了WCF 4.0是否支持异步事务。
例如,我启用了客户端\服务事务的几个服务操作,在客户端,我使用TransactionScope,在事务中,我创建任务以异步调用这些操作。
在这种情况下,我假设交易能够正常运作,是吗?
答案 0 :(得分:0)
我非常怀疑。如果您开始执行ascync操作,您似乎不再参与原始交易。
我写了一点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
}
}
答案 1 :(得分:0)
您需要在创建的任务中设置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
}
}
你可能会怀疑这是重复的,所以我建议为它写一个帮手。