DbContextTransaction Rollback

36

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

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 是否也有类似的行为?

2个回答

51

不需要显式调用Rollback。tx 变量将在 using 块完成时被处理,如果未调用Commit()则事务将被回滚。

我使用 SQL Server 活动监视器进行了测试,观察锁定的数据库对象以及针对数据库的查询,以观察数据何时被回滚。在我的 select 语句中使用 nolock 提示来查看数据库中未提交的更改。
例如:select top 10 * from [tablename] (nolock) order by modifiedDate


7
我进行了测试,得到了相同的结果,但我没有找到与处理事务回滚相关的文档。 - Akira Yamamoto
我知道这篇文章有点旧了,但现在已经有相关文档了:https://learn.microsoft.com/en-us/ef/core/saving/transactions 并且它证实了这个答案。 - E-A

4
对于EF来说,数据库提供程序是任意的和可插拔的,提供程序可以被MySQL或任何其他具有EF提供程序实现的数据库替换。因此,从EF的角度来看,不能保证提供程序会自动回滚已处理的事务,因为EF不知道数据库提供程序的实现方式。
这个答案基本上解释了所有与所有msdn文档混淆,并且显式调用“回滚”的困惑:https://dev59.com/d2Eh5IYBdhLWcg3wYSg2#28915506

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接