Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#EntityFramework:使用DTC在同一服务器上的两个不同数据库上进行事务处理_C#_Entity Framework_Distributed Transactions - Fatal编程技术网

c#EntityFramework:使用DTC在同一服务器上的两个不同数据库上进行事务处理

c#EntityFramework:使用DTC在同一服务器上的两个不同数据库上进行事务处理,c#,entity-framework,distributed-transactions,C#,Entity Framework,Distributed Transactions,我的情况与这里描述的基本相同 比如: ContextB和ContextA都位于同一个MS SQL Server(13.0.4206.0版)上。c#代码从远程工作站执行。服务器和工作站都在同一个域网络中。 但当ContextB尝试进行第一次操作时,它会引发以下错误: MSDTC事务管理器无法从中提取事务 由于通信问题,源事务管理器无法启动。可能的 原因是:存在防火墙,并且没有例外 在MSDTC过程中,这两台机器无法通过各自的路径找到对方 NetBIOS名称,或未启用对网络事务的支持 对于两个事务管

我的情况与这里描述的基本相同

比如:

ContextB和ContextA都位于同一个MS SQL Server(13.0.4206.0版)上。c#代码从远程工作站执行。服务器和工作站都在同一个域网络中。 但当ContextB尝试进行第一次操作时,它会引发以下错误:

MSDTC事务管理器无法从中提取事务 由于通信问题,源事务管理器无法启动。可能的 原因是:存在防火墙,并且没有例外 在MSDTC过程中,这两台机器无法通过各自的路径找到对方 NetBIOS名称,或未启用对网络事务的支持 对于两个事务管理器之一。(HRESULT的例外情况: 0x8004D02B)

如果我改变了任务的顺序,这没有任何区别;先说做smth。在ContextB上,然后在ContextA上:在这种情况下,从ContextA操作数据库时会引发错误。 没有事务范围,一切都可以正常工作(当然没有事务)。 我已经检查了服务器上的防火墙设置:为域和专用网络启用了分布式事务协调器的预定义规则。我还检查了DTC属性:

网络故障诊断码访问:true

允许入站:true

AllowOutbound:正确

怎么了?看起来很简单,我监督过什么吗


感谢您的回答。

已解决:需要在工作台上激活预定义的防火墙规则“分布式事务协调器”,c#代码也在工作台上运行

我不知道数据库服务器将打开一个连接,返回到事务初始值设定项(这是我的工作站)。在这种情况下,事务初始值设定项似乎继承了协调员的角色,而不是服务器


谢谢你的提示

我不确定我是否会急于让远程工作站参与DTC操作——这听起来很危险;但是:dtcping从工作站到服务器是否有效?您是否需要让DTC参与其中?由于数据库位于同一台服务器上,也许您可以在没有DTC的情况下做到这一点?@MarcGravel使用dtcping实用程序arround,得出了一个结论-请参阅线程answer@Evkdtc由.NET事务框架隐式引发。。。,所以实际上我不能影响它的行为…我听说你可以使用相同的连接字符串,然后使用ChangeDatabase方法。在这种情况下,由于连接字符串相同,因此不应涉及DTC。
using (var transaction = new TransactionScope())
{
    using (var entities = new ContextA())
    {
        // do smth. here
    }

    using (var entities = new ContextB())
    {
        // do smth. there
    }
}