我有一个应该使用分布式事务的服务。
[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模式?我不想在没有抛出异常的情况下完成交易。
答案 0 :(得分:1)
交易范围可以嵌套。如果您没有完成任何范围,整个交易将中止。所以:
using (new TransactionScope()); //Doom transaction
更好地评论这一行。
您也可以尝试拨打Transaction.Current
上的内容,但我对此没有经验。