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

本文关键字:WCF 分布式 事务 返回值 | 更新日期: 2023-09-27 18:15:08

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

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

由于我没有责任的原因,这个服务不应该抛出错误。如果成功返回一个值,如果失败返回另一个值(这里抽象为bool用于演示)。

事务流工作。

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

我已经尝试了各种方法:

  • 比较明显的是:将TransactionAutoComplete设置为false。这意味着我必须使用基于会话的服务。我不想。我不需要。我完全可以接受每个调用一个事务范围。但这是不允许的。("TransactionAutoComplete设置为false需要使用InstanceContextMode.PerSession.")

  • DIY:设置TransactionScopeRequiredfalse,使用自己的。这意味着流事务不再工作,我每次都创建一个新的本地事务。

  • 绝望的一个:试图获得WCF创建的事务并自己回滚它…这导致我的服务抛出异常,因为它试图自动完成一个早已消失的事务。

我没主意了。有人知道如何创建我自己的事务范围,使用流分布式事务,不是使用微软自动完成-正常返回模式吗?我希望在不抛出异常的情况下不完成交易

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

事务范围可以嵌套。如果没有完成任何作用域,整个事务将终止。所以:

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

最好注释这一行。

你也可以尝试调用Transaction.Current上的东西,但我没有经验。