【问题标题】:NLog within TransactionScope causing Transaction to be invalidTransactionScope 中的 NLog 导致 Transaction 无效
【发布时间】:2012-05-22 23:00:14
【问题描述】:

我在生产环境中遇到了一个我没有在本地解决的问题。

我正在 TransactionScope 中运行一些 LINQ to SQL 代码,如下所示:

        using (var scope = new TransactionScope())
        {
            uploadRepository.SubmitChanges();
            result = SubmitFileResult.Succeed();

            ScanForNewData(upload);

            scope.Complete();
        }

ScanForNewData() 调用 GetSubmittedData()。如果 GetSubmitted() 发生异常,我们使用 Nlog 将错误写入文件、数据库并发送电子邮件:

        catch (Exception ex)
        {
            //MT - having to comment this out beause it is causing a problem with transactions on theproduction server
            logger.ErrorException(String.Format("Error reading txt file {0} into correct format", upload.DocumentStore.FileName), ex);
            return new UploadGetSubmittedDataResult { Exception = ex, Success = false, Message = String.Format("Error reading txt file {0} into correct format", upload.DocumentStore.FileName) };
        }

然后在 ScanForNewData 中,我们调用 repository.SubmitChanges()。这会导致:

该操作对事务的状态无效。 System.Transactions.TransactionException TransactionException System.Transactions.TransactionException: 该操作对于事务的状态无效。

我想出的最佳想法是,在生产环境中,此代码在 Web 服务器上运行并调用单独的数据库服务器。 DataContext 和 Nlog 都具有相同的连接字符串配置和 Sql 用户,但可能是因为服务器是远程的(而我在本地使用集成安全性)发生了一些奇怪的事情。

知道在这种情况下交易会发生什么吗?

更新 - 我刚刚在本地使用 SQL 用户进行了尝试,它仍然可以正常工作。一定与制作设置有关...

另一个更新 - 我撒谎。在开发过程中,Nlog 数据库记录永远不会被写入,电子邮件已发送,并且不会发生 TransactionException。

【问题讨论】:

标签: c# .net transactionscope nlog


【解决方案1】:

如果没有完整的异常堆栈跟踪,很难猜测问题是什么,它可能取决于多种因素。

例如,我假设 NLog 我自己打开了一个到数据库的新连接,这可能会导致事务被提升为分布式事务,并且分布式事务协调器将启动。这可能会导致不对称在生产环境和本地应用程序的行为之间。

您可能会通过其中的某些操作破坏事务,例如某些未处理的异常或非法访问某些数据。

提供完整的堆栈跟踪和更多涉及的代码以进行更深入的分析。

【讨论】:

    【解决方案2】:

    如果不知道 TransactionException 的内部异常是什么,将很难解决,但这里有一个想法:

    如果您重构代码以在 事务范围周围的 using 块结束后发生日志记录,您可能会避免遇到的问题,因为事务范围将结束并且 DTC 将滚动退回交易。

    我过去在处理事务时使用并看到过这种模式(直到事务结束并回滚后才记录)并且效果很好。

    始终建议在单独的数据库上进行日志记录以避免此类问题。如果你这样做了,这个问题也将被避免。

    【讨论】:

      【解决方案3】:

      看看这个..似乎是 Nlog 的一个错误。

      https://groups.google.com/forum/#!msg/nlog-users/I5UR-bISlTA/6RPtOZhR4NoJ

      建议的解决方案是使用异步目标进行 Db 日志记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2013-10-19
        • 2016-09-09
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        相关资源
        最近更新 更多