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