【发布时间】:2019-04-29 07:17:57
【问题描述】:
我正在尝试在单个事务中同时实现 DbContext(SQLDBContext 和 DB2Context),但每次都面临与 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