【问题标题】:c# EntityFramework: TransactionScope over two different databases on same server with DTCc# EntityFramework:TransactionScope 使用 DTC 在同一服务器上的两个不同数据库上
【发布时间】: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


【解决方案1】:

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

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

感谢您的提示!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多