如何使用上下文SQL DB和DB2在Entity Framework 5中实现单个事务

时间:2018-11-27 14:08:06

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

我试图在单个事务中同时实现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();
}

谢谢!

1 个答案:

答案 0 :(得分:0)

使用DB2,您将必须为MSDTC启用XA事务。由于您还在使用多个数据库,因此 您可能还必须启用Network DTC Access(请参见下图)。

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

MSDTC Configuration