【发布时间】:2018-08-10 11:22:31
【问题描述】:
我的情况与这里描述的基本相同Multiple databases(datacontext) on same server without MS DTC
喜欢:
using (var transaction = new TransactionScope())
{
using (var entities = new ContextA())
{
// do smth. here
}
using (var entities = new ContextB())
{
// do smth. there
}
}
ContextB 和 ContextA 都位于同一个 MS SQL Server (V. 13.0.4206.0) 上。 c# 代码从远程工作站执行。服务器和工作站都在同一个域网络中。 但是当 ContextB 尝试进行第一次操作时,它会引发以下错误:
MSDTC 事务管理器无法从 由于通信问题,源事务管理器。可能的 原因是:存在防火墙并且它没有例外 在 MSDTC 进程中,两台机器无法通过它们找到对方 NetBIOS 名称,或未启用对网络事务的支持 对于两个事务管理器之一。 (HRESULT 的例外情况: 0x8004D02B)
如果我改变任务的顺序没有任何区别;先说做某事。在 ContextB 上,然后在 ContextA 上:在这种情况下,从 ContextA 操作数据库时会引发错误。 没有事务范围一切正常(但当然没有事务)。 我检查了服务器上的防火墙设置:为域和专用网络启用了分布式事务协调器的预定义规则。我还检查了 DTC 属性:
网络 DTC 访问:true
允许入站:true
允许出站:真
怎么了?看起来很简单,我监督了什么吗?
感谢您的回答。
【问题讨论】:
-
我不确定我是否会急于让远程工作站参与 DTC 操作 - 这听起来很冒险;但是:dtcping 从那个工作站到服务器是否有效?
-
您是否需要让 DTC 参与其中?由于数据库在同一台服务器上,也许您可以在没有 DTC 的情况下做到这一点?
-
@MarcGravell 玩了 dtcping 实用程序并得出结论 - 请参阅线程答案
-
@Evk dtc 是由 .NET 事务框架隐式提出的......,所以实际上我无法影响它的行为......
-
听说可以使用相同的连接字符串,然后使用ChangeDatabase方法。在这种情况下,因为连接字符串是相同的 - 不应该涉及 DTC。
标签: c# entity-framework distributed-transactions