c#EntityFramework:使用DTC在同一服务器上的两个不同数据库上的TransactionScope

时间:2018-03-02 09:04:53

标签: c# entity-framework distributed-transactions

我基本上和此处描述的情况相同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

有什么问题?它看起来很简单,我是否监督过什么?

感谢您的回答。

1 个答案:

答案 0 :(得分:2)

已解决:需要激活预定义的防火墙规则'分布式事务处理协调器'在工作中,也是c#代码运行的地方。

我不知道数据库服务器会打开一个连接回事务初始化器(这是我的工作站)的连接。在这种情况下,似乎事务初始化器继承角色作为协调器 - 而不是服务器。

感谢您提供的提示!