事务范围不回滚,尽管没有调用 complete()

本文关键字:调用 complete 范围 事务 | 更新日期: 2023-09-27 17:56:51

我正在使用 TransactionScope 回滚失败的事务

bool errorReported = false;
Action<ImportErrorLog> newErrorCallback = e =>
{
    errorReported = true;
    errorCallback(e);
};
using (var transaction = new TransactionScope())
{
    foreach (ImportTaskDefinition task in taskDefinition)
    {
        loader.Load(streamFile, newErrorCallback, task.DestinationTable, ProcessingTaskId);
    }
    if (!errorReported)
        transaction.Complete();
}

我确定在此代码之前或之后没有启动事务范围。我正在使用实体框架插入我的数据库。

无论errorReported的状态如何,如果发生错误,事务都不会回滚。

我错过了什么?

事务范围不回滚,尽管没有调用 complete()

TransactionScope设置

Transaction.Current .这就是它所做的一切。任何想要交易的东西都必须查看该属性。

我相信每次出于任何原因打开连接时,EF 都会这样做。安装示波器时,您的连接可能已打开。

打开作用域内的连接或手动登记。

EF 还有另一个令人讨厌的"设计决策":默认情况下,它为每个查询打开一个新连接。这会导致分布式事务以非确定性的方式出现。一定要避免这种情况。