事务范围不回滚,尽管没有调用 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
的状态如何,如果发生错误,事务都不会回滚。
我错过了什么?
TransactionScope
设置Transaction.Current
.这就是它所做的一切。任何想要交易的东西都必须查看该属性。
我相信每次出于任何原因打开连接时,EF 都会这样做。安装示波器时,您的连接可能已打开。
打开作用域内的连接或手动登记。
EF 还有另一个令人讨厌的"设计决策":默认情况下,它为每个查询打开一个新连接。这会导致分布式事务以非确定性的方式出现。一定要避免这种情况。