我基本上和此处描述的情况相同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#代码从远程Workstation执行。 Server和Worksation都在同一个域网络中。 但是当ContextB尝试进行第一次操作时,它会引发以下错误:
MSDTC事务管理器无法从中提取事务 源事务管理器由于通信问题。可能 原因是:存在防火墙,它没有例外 在MSDTC过程中,两台机器无法通过它们找到对方 未启用NetBIOS名称或对网络事务的支持 对于两个交易经理之一。 (HRESULT的例外情况: 0x8004D02B)
如果我改变任务的顺序,它没有任何区别;先说做smth。在ContextB上,然后在ContextA上:在这种情况下,当从ContextA操作数据库时,错误会引发。 没有交易范围,一切正常(但当然没有交易)。 我检查了服务器上的防火墙设置:为域和专用网络启用了分布式事务处理协调器的预定义规则。我也检查了DTC的特性:
网络DTC访问:true
允许入站:true
AllowOutbound:true
有什么问题?它看起来很简单,我是否监督过什么?
感谢您的回答。
答案 0 :(得分:2)
已解决:需要激活预定义的防火墙规则'分布式事务处理协调器'在工作中,也是c#代码运行的地方。
我不知道数据库服务器会打开一个连接回事务初始化器(这是我的工作站)的连接。在这种情况下,似乎事务初始化器继承角色作为协调器 - 而不是服务器。
感谢您提供的提示!