【问题标题】:Multiple WCF service calls in ACID transactionACID 事务中的多个 WCF 服务调用
【发布时间】:2010-03-10 17:17:17
【问题描述】:

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

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

如果一个调用失败,所有调用都失败...请注意,这些服务可能不在同一个域中。

干杯!

【问题讨论】:

    标签: wcf acid


    【解决方案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 设置!)

    【讨论】:

    • 这会涉及到 MSDTC,不是吗?如果是这样的话……准备好承受巨大的痛苦……
    • @Alex:如果它处理多个资源,是的。诚然,DTC 是一种痛苦,但通常是唯一可行的解​​决方案 - 或根本不支持事务......
    【解决方案2】:

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

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

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

    例如,如果您需要预订汽车和酒店,然后酒店被烧毁,您不能指望取消预订汽车而不会损失一些钱。

    但是,如果所有服务都位于同一个数据库之上,那么事务可能对您很有效。

    【讨论】:

    • @Ian:你能说出你期待哪些问题吗?
    • 我很想知道那些现实世界的问题是什么,但是是的,所有服务都位于同一个数据库之上。
    • @John,例如,在美国办事处运行 ServiceB 的 IT 人员在不同时间恢复数据库,而在英国为另一家公司运行 ServiceC 的 IT 人员。
    • @Ian:这与交易有什么关系?这更像是一个能力问题而不是交易问题。
    • @John,但是系统设计必须适应现实世界,在现实世界中,只要你做任何事情,你就会遇到很多“能力问题”使用并非全部由一个人控制的服务。
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2020-06-24
    • 2018-12-17
    • 1970-01-01
    • 2010-11-26
    • 2022-01-18
    • 2017-04-09
    相关资源
    最近更新 更多