ACID事务中的多个WCF服务调用

时间:2010-03-10 17:17:18

标签: wcf acid

这是我的场景:在完成交易之前,我需要对不同的WCF服务进行三次或四次调用 - 如果有的话,我有哪些选择?

ServiceA.SaveWork(work1);
ServiceB.SaveWork(work2);
ServiceC.SaveWork(work3);
ServiceD.SendNotification(notification);

如果一个呼叫失败,则全部失败...请注意,这些服务可能不在同一个域中。

干杯!

2 个答案:

答案 0 :(得分:1)

您应该能够将这些内容包装到System.Transctions.TransactionScope中以实现此目的:

using(TransactionScope scope = new TransactionScope())
{
   ServiceA.SaveWork(work1);
   ServiceB.SaveWork(work2);
   ServiceC.SaveWork(work3);
   ServiceD.SendNotification(notification);

   scope.Complete();
}

当然,您需要确保您的WCF服务没有明确阻止成为事务的一部分! (查看TransactionFlow属性 - 避免TransactionFlow.NotAllowed设置!)

答案 1 :(得分:1)

如果这些服务都在不同的机器上,那么使用两阶段提交会导致很多现实问题。

因此,我认为交易不是一个好的解决方案......

我认为您需要提供所有服务,以便在需要从错误中恢复时撤消工作。在现实世界中撤销一项工作可能非常复杂。

例如,如果您需要预订汽车和酒店,然后酒店烧毁,您不能指望能够在不损失部分费用的情况下取消预订。

但是,如果所有服务都位于相同的数据库之上,那么交易可能适合您。