是否有可能在交易范围内从投票中排除交易?

时间:2014-02-19 06:34:11

标签: .net ado.net transactionscope

transactioncope范围内的每个事务都为提交投票。 TS一切都没有。

我想用transactionscope包装几个方法。

using(var ts = new TransactionScope())
{
    DoSomething1();
    DoSomething2();

    ts.Complete();
}

两种方法都打开连接并尝试提交。在死锁超时的情况下,他们会多次尝试重建与事务的连接。因此,我需要将失败的交易排除在投票之外并留下成功的交易。

2 个答案:

答案 0 :(得分:2)

将重试逻辑放在TransactionScope之外。执行后不能排除操作。在执行操作之前,您必须决定事务成员资格。

您当然可以使用TransactionScopeOption.RequiresNew启动独立交易,但它们将独立于外部TransactionScope,这会使外部TransactionScope无用。

此外,无法避免死锁导致死亡。原则上需要从死锁图中删除锁。处理死锁的正确方法是重试整个事务,仅仅是其中的一部分,甚至是单个语句。这将导致不完整的效果。

答案 1 :(得分:1)

交易被视为“全有或全无”,并且它们必须符合ACID。如果你想允许失败的事务,那么它不再是事务操作,它是业务逻辑的一部分,应该为此重写。

您可以按照TransactionScopeOption

中的提及来处理交易
  

抑制:创建范围时,将禁止环境事务上下文。范围内的所有操作都是在没有环境事务上下文的情况下完成的。

连接和上下文生命周期

必须重写多个处理多个逻辑的方法,这些方法涉及打开到同一个数据库的多个连接,只需一个连接和一个上下文就可以调用整个逻辑。如果在事务中调用每个方法,那么为什么要在每个方法中创建事务?