【问题标题】:How to implement single transaction in Entity Framework 5 with both context SQL DB and DB2如何使用上下文 SQL DB 和 DB2 在 Entity Framework 5 中实现单个事务
【发布时间】:2019-04-29 07:17:57
【问题描述】:

我正在尝试在单个事务中同时实现 DbContextSQLDBContextDB2Context),但每次都面临与 DB2 相关的问题。

它在 SQL 上运行良好,但在尝试访问 DB2 时抛出错误。

例外是:

DB2Entities getter 出错。与底层事务管理器的通信失败。

由于通信问题,MSDTC 事务管理器无法从源事务管理器中提取事务。可能的原因是:存在防火墙并且它对 MSDTC 进程没有异常,两台机器无法通过它们的 NetBIOS 名称找到彼此,或者两个事务管理器之一未启用对网络事务的支持。 (HRESULT 异常:0x8004D02B)

请帮助我在单个事务下实现两个数据库事务或 如果其中一个失败,那么两者都应该回滚。

代码如下:

var option = new TransactionOptions
{
    IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted,
    Timeout = TimeSpan.FromSeconds(60)
};

using (var scopeOuter = new TransactionScope(TransactionScopeOption.Required, option))
{
    SQLDBContext.Table.AddSomething();
    SQLDBContext.SaveChanges();

    using (var scopeInner = new TransactionScope(TransactionScopeOption.Required, option))
        {
                DB2Context.Table.AddSomething();
                DB2Context.SaveChanges();
                scopeInner.Complete();
        }
       scopeOuter.Complete();
}

谢谢!

【问题讨论】:

  • 您是否尝试过检查所涉及的任何机器(两台数据库服务器和您的开发机器)上的 MSDTC 是否已安装、启用且未被防火墙阻止?另请注意,事务在需要之前不会提升为分布式事务,因此即使 MSDTC 配置不正确,仅在 SQL 服务器上执行一系列更新也可以正常工作。
  • 我应该说,在所有机器上都安装并启用,并且没有被防火墙阻止。
  • 编辑您的问题以完整描述每个组件的版本,例如您正在为 Db2 使用哪个 .net 数据服务器提供程序,哪个 .net 框架版本,哪个 VSAI 版本,哪个 Db2 客户端位数和版本详细信息。

标签: c# db2 entity-framework-5 transactionscope distributed-transactions


【解决方案1】:

使用 DB2,您必须为 MSDTC 启用 XA 事务。由于您还使用多个数据库,您可能还必须启用网络 DTC 访问(见下图)。

要更改这些设置,请打开组件服务管理插件(管理工具 -> 组件服务,或运行 comexp.msc)。然后在计算机 -> 我的电脑 -> 分布式事务协调器下,右键单击“本地 DTC”并点击属性。您将看到下面的屏幕。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多