DbContextTransaction回滚

时间:2014-04-07 12:37:54

标签: entity-framework

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的行为是否相似?

2 个答案:

答案 0 :(得分:32)

不,没有必要显式调用Rollback。当using块完成时,将处理tx变量,如果尚未调用Commit(),则将回滚事务。

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

答案 1 :(得分:0)

  

对于EF,数据库提供程序是任意的和可插入的,并且   提供程序可以替换为MySQL或具有   EF提供者实施。因此,从EF的角度来看,   无法保证提供程序将自动回滚   所处置的交易,因为EF不了解   数据库提供程序的实现。

此答案几乎可以解释所有内容,以及所有具有 Rollback 明确调用的https://stackoverflow.com/a/28915506/5867244

的msdn文档