如何分离我的TransactionScopes以使它们不会相互干扰?

时间:2014-06-02 08:52:31

标签: c# ado.net transactionscope

我有一些在简单的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来改变我的交易交互方式,但这是正确的做法吗?我应该使用哪个?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

登录新的交易通行证TransactionScopeOption.RequiresNew

答案 2 :(得分:0)

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