使用正常返回值的WCF分布式事务流

时间:2014-07-28 13:01:13

标签: c# wcf transactions distributed-transactions msdtc

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

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

由于我的责任,这项服务绝不应该抛出错误。成功时,它返回一个值,失败时返回另一个值(为了演示目的而抽象为bool)。

交易流程有效。

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

我尝试了各种方法:

  • 显而易见的一个:将TransactionAutoComplete设置为false。这意味着我使用基于会话的服务。我不想。我不需要。对于每个呼叫的单个事务范围,我完全没问题。但它不被允许。 (" TransactionAutoComplete设置为false需要使用InstanceContextMode.PerSession。")

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

  • 绝望的人:试图抓住WCF创建的事务并将其自行回滚...这导致我的服务抛出异常,因为它试图自动完成一个早已消失的事务。 / p>

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

1 个答案:

答案 0 :(得分:1)

交易范围可以嵌套。如果您没有完成任何范围,整个交易将中止。所以:

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

更好地评论这一行。

您也可以尝试拨打Transaction.Current上的内容,但我对此没有经验。