繁体   English   中英

EF6 嵌套事务

[英]EF6 Nested Transactions

我有一个命令服务 class,它利用工作单元模式,使用各种方法通过实体框架更新数据库(在本例中为 SQL Azure)。

命令服务通过对 dbcontext 实例的引用进行实例化,其生命周期由我选择的 DI 框架管理。

一些命令服务类的方法将对数据库的多个更新包装在一个事务中,例如:

public void UpdateStuff(someEntity)
{
    using(var tx = _db.Database.BeginTransaction())
    {
        //Some updates to db
        _db.SaveChanges();
        //Some other updates to db
        _db.SaveChanges();
        tx.Commit();
    }
}

现在,其中一些方法从其事务中调用命令 class 的其他方法,例如:

public void UpdateWithSomeCascadingStuff(someOtherEntity)
{
    using(var tx = _db.Database.BeginTransaction())
    {
        //Some updates to db
        _db.SaveChanges();

        //Some other cascading logic and updates to db
        var relatedEntityToUpdate = _query.GetSomeEntityToUpdate(someOtherEntity);
        UpdateStuff(relatedEntityToUpdate);
        _db.SaveChanges();
        tx.Commit();
    }
}

显然,通过这样做,我为同一个 DbContext 实例嵌套了 EF 事务。

这是否受支持,会造成任何麻烦吗? 我可以采取其他方法吗?

更新:我首先使用 EF6 代码

EntityFramework的DBContexts本身实现了UnitOfWork和Repository模式。

EF6中的上下文也自动包装事务中的所有提交(如果它还不是一部分)。

所以,不,你不应该在多个工作单元之间共享一个上下文。 他们应该各自得到自己的。

UPDATE

如果您尝试在同一个DbContext上启动重复事务,则会得到:

An unhandled exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll

Additional information: The connection is already in a transaction and cannot participate in another transaction. EntityClient does not support parallel transactions.

所以不,你不能做你想要的。

在 EF Core 5 中有一个新特性:保存点

您可以在退出的截断和回滚中添加保存点:

保存点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM