【问题标题】:Using asynchronous save changes on Entity Framework with multiple contexts在具有多个上下文的实体框架上使用异步保存更改
【发布时间】:2015-11-07 20:25:13
【问题描述】:

我正在使用带有 UoW 模式的 EF 6。由于我使用来自多个数据库的数据,因此我在 UoW 中定义了多个上下文。除了我定义的 CommitAsync 函数外,一切似乎都正常工作。这是我的代码:

    public async Task CommitAsync()
    {
        try
        {
            using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
            {
                if (_context1 != null)
                    await _context1.SaveChangesAsync();
                if (_context2 != null)
                    await _context2.SaveChangesAsync();

                scope.Complete();
            }
        }
        catch (DbEntityValidationException ex)
        {
            //..
        }
    }

当我在两个上下文中运行此代码保存更改时,我得到:

事务管理器已禁用对远程/网络事务的支持。 (HRESULT 异常:0x8004D024)

等待_context2.SaveChangesAsync();是错误发生的地方。如果我从此函数中删除 TransactionScope,则代码似乎可以正常工作。我对删除多个上下文的范围犹豫不决。

以防万一,这是我用来调用此函数的代码:

        state.Name = "Texas";
        _uow.StateRepository.Update(state);

        user.FirstName = "John";
        _uow.UserRepository.Update(user);

        await _uow.CommitAsync();

谢谢!

【问题讨论】:

  • 代码没有问题,它是运行代码的盒子上的配置 msdtc 已禁用远程/网络事务。
  • 为什么要使用TransactionScope?如果保存失败,无论如何都会撤消。使用 TransactionScope 只会导致可能的死锁。
  • @JamieRees 我怀疑 OP 希望两个更新都能正常工作或两者都失败,并避免一个工作但一个失败的情况。
  • 是的,这很有道理!
  • 你知道这需要分布式事务吗?主要问题是它们不适用于许多 HA 解决方案。问题 2 是性能。

标签: c# asp.net-mvc entity-framework async-await unit-of-work


【解决方案1】:

在同一范围内使用两个连接需要 MSDTC。

您可以启用 MSDTC 来解决此问题。但它不适用于许多 HA 解决方案并且速度很慢。

避免使用 MSDTC 的唯一方法是对所有必须进行事务处理的事物使用相同的连接。由于您使用的是比平时更难的多个数据库。您需要使用SqlConnection.ChangeDatabase 或发出相应的 SQL 以在同一连接上的数据库之间切换。连接必须保持打开状态。

或者,您可以为对象引用使用三个部分名称(例如DB1.dbo.MyTable)。

没有其他办法。 MSDTC 或共享同一连接。

【讨论】:

  • 感谢您的帮助。我想另一种选择只是删除范围,但留下了 Ben 发布的上述内容的可能性。我想这在我的情况下不会很糟糕,因为保存在不同数据库中的数据并不真正相关。
  • @AaronSanders 如果你喜欢调试不一致的数据......这会发生。超时随时可能发生。
  • @AaronSanders 为您补充阅读“两位将军的问题”。这是描述 FRIGGIN 硬分布式事务的思想实验。
  • @Aron 说得好,大多数人不知道不可能拥有 100% 可靠的分布式事务。奇怪的是,这在产品文档中从未提及...
  • @usr 我假设大多数人都希望软件遵守数学/物理定律。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多