【问题标题】:EntityFramework, TransactionScope and SaveChange实体框架、TransactionScope 和 SaveChanges
【发布时间】:2016-03-03 23:44:10
【问题描述】:

我正在使用 EntityFramework 开发一个 c# 项目,最后一位开发人员写道:

using (System.Transactions.TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{
    try
    {
        //... do somehting
        context.SaveChanges();

        //... do some other work
        context.SaveChanges();

        scope.Complete();
    }
    catch (Exception ex)
    {
       context.RollbackChanges();
       scope.Complete();
    }
}

我不明白他为什么使用TransactionScope。我试图在 2 SaveChanges 之间抛出异常,但它没有回滚第一次调用修改。

为什么使用TransactionScope

谢谢

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    这应该为你解释 - https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

    编辑:根据 szer 的要求。

    他们从链接中获得的关键信息是:

    “如果你调用 SaveChanges() 或 SaveChanges(true),EF 只是假设如果它的工作正常完成,一切正常,所以它会丢弃它一直在跟踪的更改,并等待新的更改。”

    【讨论】:

      【解决方案2】:

      您需要在作用域对象上调用Rollback() 方法。要创建范围,请致电context.Database.BeginTransaction()

      using (var scope = context.Database.BeginTransaction()) 
      { 
          try 
          { 
              // do some stuff 
              context.SaveChanges(); 
      
              // do other stuff 
              context.SaveChanges(); 
      
              scope.Commit(); 
          } 
          catch (Exception) 
          { 
              scope.Rollback(); 
          } 
      } 
      

      【讨论】:

      • 为什么要在新的 TransactionScope 上使用 BeginTransaction?那么指定的isolationLevel呢?
      【解决方案3】:

      就像 Marc 解释的那样,您需要回滚 TransactionScope,而不是 EF 上下文事务。 TransactionScope 创建了一个环境事务,操作可以加入其中。因此,您在这里所做的是创建一个包含多个事务并可以一次提交或回滚所有事务的事务。

      您的代码中发生的事情是这样的:

      1. 您正在提交查询 1(使用 SaveChanges 调用)。
      2. 您正在提交查询 2(使用 SaveChanges 调用)。
      3. 发生错误。
      4. 您正在回滚最新的事务(查询 2)。请注意,查询 1 仍处于提交状态。
      5. 您正在提交环境事务,“保存”结果。这意味着最终结果是查询 1 已提交,查询 2 已回滚。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 2023-01-29
        • 1970-01-01
        相关资源
        最近更新 更多