DbContextTransaction 回滚

Posted

技术标签:

【中文标题】DbContextTransaction 回滚【英文标题】:DbContextTransaction Rollback 【发布时间】: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 的行为是否类似?

【问题讨论】:

【参考方案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://***.com/a/28915506/5867244

【讨论】:

以上是关于DbContextTransaction 回滚的主要内容,如果未能解决你的问题,请参考以下文章

java jdbc addBatch批处理不回滚

关于 truncate table 的一点学习札记

什么是回滚操作

在不自动提交的情况下,回滚段有啥用。

spring自己抛出异常,居然不能回滚

各位大侠,请问git怎么回滚版本