工作单元的行为+实体框架+事务没有显式异常回滚

时间:2016-11-15 08:34:25

标签: c# entity-framework transactions unit-of-work

当在一个使用中启动事务然后发生异常时会发生什么,但是从不发生回滚,因为没有try-catch回滚?

为了更详细地说明问题,请参阅以下示例: 我们使用工作单元模式来生成业务事务。

工作单元封装在一个使用中。在启动工作单元时,我们可能会开始一项交易(参见下面的示例。)

//Starts a transaction
using (var uow = repositoryFactory.BeginUnitOfWork(true))
{
    //do stuff
    uow.Commit();
}

使用实体框架启动交易:

 CurrentContext.Database.BeginTransaction()

现在的问题是,当"做东西时会发生异常会发生什么?回滚是自动触发的吗?

存储库工厂处理" CurrentContext"如下:

public void Dispose()
{
    if (CurrentContext != null)
    {
        CurrentContext.Dispose();
    }
    CurrentContext = null;
    GC.SuppressFinalize(this);
}

我发现,如果关闭与数据库的连接(s。What happens if you don't commit transaction in a database (say SQL Server)),将关闭一个打开的事务。 问题是,当连接关闭时,它会释放回池中(s。https://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx):

  

当连接关闭时,它会被释放回池中   根据其事务上下文进入适当的细分。   因此,您可以关闭连接而不会产生错误,   即使分布式事务仍处于待处理状态。这允许   您稍后提交或中止分布式事务。

1 个答案:

答案 0 :(得分:0)

没有try-catch块,但是有try-finally块,这就是using语句本身,大致相当于以下内容:

var uow = repositoryFactory.BeginUnitOfWork(true);
try
{
    //do stuff
    uow.Commit();
}
finally {
    // pseudo-code
    if (!uow.IsComplete) {
        uow.Rollback();
    }
}

因此,如果发生异常 - 即使没有使用显式的try-catch块,事务也将被回滚。如果您没有明确提交,也会发生同样的情况。