【问题标题】:TransactionScope not rolling back although no complete() is called尽管没有调用 complete(),但 TransactionScope 没有回滚
【发布时间】:2015-09-04 00:47:14
【问题描述】:

我正在使用 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();
}

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

无论errorReported 的状态如何,事务都不会在出错时回滚。

我错过了什么?

【问题讨论】:

  • 如果您决定希望该块成为自己的交易,独立于环境交易,您可以new TransactionScope(TransactionScopeOption.RequiresNew)

标签: c# sql entity-framework


【解决方案1】:

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

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

在范围内打开连接或手动登记。

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

【讨论】:

  • 也许我用来加载工厂的依赖注入可能是问题的根源......在这个指导中搜索,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
相关资源
最近更新 更多