【问题标题】:WCF Distributed Transaction Flow using normal return values使用正常返回值的 WCF 分布式事务流
【发布时间】:2014-09-19 16:16:15
【问题描述】:

我有一个应该使用分布式事务的服务。

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public bool ServiceMethod(int parameterPlaceHolder)
{
  return SomeOperationResult();
}

出于我不负责任的原因,此服务绝不应引发错误。成功时返回一个值,失败时返回另一个值(此处抽象为 bool 用于演示目的)。

事务流动有效。

但是,该属性意味着任何不是未捕获异常的结果都将完成事务。这不是我想要的行为。我想自己控制交易的结果。返回 false 时,我希望交易失败。

我尝试了各种方法:

  • 显而易见的一个:将TransactionAutoComplete 设置为false。这意味着我必须使用基于会话的服务。我不想。我不需要。每次调用一个事务范围我都很好。但这是不允许的。 (“TransactionAutoComplete 设置为 false 需要使用 InstanceContextMode.PerSession。”)

  • DIY 一个:将TransactionScopeRequired 设置为false 并使用我自己的。这意味着流动的交易不再起作用,我每次都创建一个新的本地交易。

  • 绝望的一个:试图获取 WCF 创建的事务并将其回滚...这导致我的服务抛出异常,因为它试图自动完成一个早已不复存在的事务。

我没有想法。有谁知道如何使用流式分布式事务创建我自己的事务范围,不使用 Microsoft AutoComplete-On-Normal-Return 模式?我不想在不抛出异常的情况下完成交易。

【问题讨论】:

    标签: c# wcf transactions distributed-transactions msdtc


    【解决方案1】:

    事务范围可以嵌套。如果您未完成任何范围,则整个事务将中止。所以:

    using (new TransactionScope()); //Doom transaction
    

    最好评论这一行。

    你也可以尝试在Transaction.Current 上打电话,但我没有这方面的经验。

    【讨论】:

    • 我确实有一个内部事务范围,我只在 true 上完成。但是,这会导致调用者出现 ProtocolException:“执行此方法调用的事务被异步中止。”
    猜你喜欢
    • 2016-06-05
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多