【问题标题】:Is it possible to exclude transaction from the voting inside transactionscope?是否可以从事务范围内的投票中排除事务?
【发布时间】:2014-02-19 06:34:11
【问题描述】:

transactionscope 范围内的每个事务都投票提交。而 TS 就像一无所有。

我想用 transactionscope 包装几个方法。

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

    ts.Complete();
}

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

【问题讨论】:

  • 我会看到投反对票者的评论,他不喜欢这个问题。

标签: .net ado.net transactionscope


【解决方案1】:

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

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

此外,没有办法避免死锁杀死事务。这是原则上要求从死锁图中删除锁的。处理死锁的正确方法是重试整个事务,只关注其中的一部分,甚至是单个语句。这会导致效果不完全。

【讨论】:

    【解决方案2】:

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

    您可以像TransactionScopeOption 中提到的那样禁止交易

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

    连接和上下文生命周期

    调用多个处理涉及打开到同一个数据库的多个连接的多个逻辑的多个方法必须重写以仅使用一个连接和一个上下文来调用整个逻辑。如果每个方法都会在事务中被调用,那你为什么要在每个方法中创建事务呢?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    相关资源
    最近更新 更多