【问题标题】:How can I separate my TransactionScopes so they don't interfere with each other?如何分离我的 TransactionScopes,使它们不会相互干扰?
【发布时间】:2014-06-02 08:52:30
【问题描述】:

我有一些在简单的 TransactionScope 中执行的业务逻辑:

        using (var scope = new TransactionScope())
        {

            // does some logic.

            // then some more...

            scope.Complete();
        }

在执行期间发生 ADO 异常,并且正在处理事务。

与此同时,异常在上游被进一步捕获,我尝试通过另一个连接将其记录到我的数据库中。

此时我收到另一个错误提示 The operation is not valid for the state of the transaction.

哎呀!

现在我可以看到我可以使用IsolationLevel 来改变我的交易交互方式,但这样做是否正确?我应该使用哪个?

【问题讨论】:

  • 听起来您的所有代码都在大 DTC 事务中运行,对吗?
  • 不确定您的意思?如上所述..在此特定执行期间,我明确创建的唯一事务如上所述。
  • 是的,但是多个连接会导致分布式事务,您提到了针对数据库的第二个连接
  • 在记录时抑制事务是否解决了您的问题?

标签: c# ado.net transactionscope


【解决方案1】:

由于您提到了多个连接,并且您所指的错误是我在 DTC 事务中看到的,我猜您正在运行 DTC,并且由于 AdoException 导致事务状态出现故障。尝试在您的日志代码周围放置“RequiresNew”事务范围或发布更多代码,从那个小 sn-p 很难看到您的架构。

看看这个答案,显示两个连接如何根据您运行的 sql server 版本导致 DTC 启动: TransactionScope automatically escalating to MSDTC on some machines?

【讨论】:

    【解决方案2】:

    由于事务正在回滚/处置而出现问题,我会看到两个选项:使用新事务或根本不记录事务。我可能会选择第二个选项并在没有事务的情况下登录。

    您可以将TransactionScopeOption 类型的参数传递给TransactionScope constructor 以抑制您的日志记录语句的事务,如下所示:

    using (var scope = new TransactionScope(TransactionScopeOption.Suppress)
    {
        // .. log here
    }
    

    在新事务中登录 TransactionScopeOption.RequiresNew

    【讨论】:

      【解决方案3】:

      您不能在事务范围内打开两个连接。关闭第一个连接,然后打开连接以记录数据库中的错误。 看看这个"The operation is not valid for the state of the transaction" error and transaction scope

      【讨论】:

        猜你喜欢
        • 2019-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 2017-02-01
        相关资源
        最近更新 更多