这是我的场景:在完成交易之前,我需要对不同的WCF服务进行三次或四次调用 - 如果有的话,我有哪些选择?
ServiceA.SaveWork(work1);
ServiceB.SaveWork(work2);
ServiceC.SaveWork(work3);
ServiceD.SendNotification(notification);
如果一个呼叫失败,则全部失败...请注意,这些服务可能不在同一个域中。
干杯!
答案 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)
如果这些服务都在不同的机器上,那么使用两阶段提交会导致很多现实问题。
因此,我认为交易不是一个好的解决方案......
我认为您需要提供所有服务,以便在需要从错误中恢复时撤消工作。在现实世界中撤销一项工作可能非常复杂。
例如,如果您需要预订汽车和酒店,然后酒店烧毁,您不能指望能够在不损失部分费用的情况下取消预订。
但是,如果所有服务都位于相同的数据库之上,那么交易可能适合您。