我如何分离我的TransactionScopes,使它们不会';不要互相干扰

本文关键字:干扰 何分离 分离 TransactionScopes 我的 | 更新日期: 2023-09-27 18:06:08

我有一些在简单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.

Eeek!

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

我如何分离我的TransactionScopes,使它们不会';不要互相干扰

由于您提到了多个连接,并且您所指的错误是我在DTC事务中看到的,我猜您正在运行DTC,并且事务的状态由于AdoException而出现故障。试着在你的日志代码周围放一个"RequiresNew"事务范围,或者发布更多的代码,很难从这个小片段中看到你的体系结构。

看看这个答案,它显示了两个连接如何根据您运行的sql server版本导致DTC启动:TransactionScope是否在某些计算机上自动升级为MSDTC?

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

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

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

要在新事务中登录,请通过TransactionScopeOption.RequiresNew

您不能在事务范围中打开两个连接。关闭第一个连接,然后打开连接以记录数据库中的错误。看看这个";该操作对于事务"的状态无效;错误和事务范围