【问题标题】:DbContextTransaction RollbackDbContextTransaction 回滚
【发布时间】:2014-05-19 17:02:33
【问题描述】:

Entity Framework 6 引入了一种使用 BeginTransaction 方法在 DbContext 中支持事务的新方法:

var db = new MyDbContext();
using(var tx = db.Database.BeginTransaction())
{
    // update entities
    try
    {
        db.SaveChanges();
        tx.Commit();
    }
    catch(Exception)
    {
        tx.Rollback();
    }
}

方法中的 Rollback() 调用是否必要?如果没有在异常上调用它会发生什么?我知道在使用 TransactionScope 时,它​​会在处理完事务并且不调用 Complete 时自动回滚。 DbContextTransaction 的行为是否类似?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    不,没有必要显式调用回滚。 tx 变量会在 using 块结束时被释放,如果 Commit() 没有被调用,事务将被回滚。

    我已经使用 SQL Server 活动监视器对此进行了测试,通过观察数据库对象上持有的锁,以及查询数据库以观察数据何时回滚,使用我的 select 语句中的 nolock 提示能够查看数据库中未提交的更改。
    例如。 select top 10 * from [tablename] (nolock) order by modifiedDate

    【讨论】:

    • 我进行了测试并得到了相同的结果,但我没有找到任何与在处置时回滚事务相关的文档。
    【解决方案2】:

    对于 EF,数据库提供者是任意的和可插入的,并且 provider 可以替换为 MySQL 或任何其他具有 EF 提供程序实现。因此,从 EF 的角度来看, 不能保证提供者会自动回滚 已处置的交易,因为 EF 不知道 数据库提供程序的实现。

    这个答案几乎解释了所有 msdn 文档的所有内容和混淆,其中 Rollback 显式调用:https://stackoverflow.com/a/28915506/5867244

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多