MSDTC:与底层事务管理器的通信失败

7

我有一个WinForms / WCF / SQLServer应用程序,我正在尝试像这样使用MSDTC事务:

using System.Transactions;

// ...

var transOptions =
    new TransactionOptions
    {
        IsolationLevel = IsolationLevel.ReadCommitted,
        Timeout = TimeSpan.FromSeconds(120)
    };

using (var scope = new TransactionScope(TransactionScopeOption.Required,
         transOptions))
{
    // ...

    if (everything_is_ok)
        scope.Complete();
}

在我的开发环境中,服务器和客户端进程在同一台机器上,这种情况下它运行良好。但是当我部署到QA环境中,即服务器和客户端在不同的机器上时,每当调用scope.Complete()时,客户端就会挂起超时时间(2分钟),然后我会收到以下错误信息:

无法取消流式事务。出现以下异常:与底层事务管理器的通信失败。

这可能是什么原因造成的?

4个回答

10

我今天花了几个小时来解决Windows 7下的这个问题。最终它起作用了,以下是我所做的:

  1. 启用MSDTC并允许入站/出站事务(通过控制面板)
  2. 打开注册表中的端口指南 - 只需按照指南操作即可
  3. 允许在防火墙中打开(2)中定义的端口(如果使用防火墙)
  4. 允许MSDTC通过Windows防火墙 - 添加新规则以允许msdtc.exe(应位于%systemroot%\system32)的入站连接

这也许不是最好的解决方案,但实际上是我情况下唯一有效的方法。

编辑:在Windows 7 SP1下遇到MSDTC的另一个问题后,我发现需要完成以下两个步骤才能使其正常工作。

  1. 在主机文件中添加IP和NetBIOS名称之间的映射。
  2. 在HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\RPC下添加(或编辑)两个键: "RestrictRemoteClients"=dword:00000000 "EnableAuthEpResolution"=dword:00000000

2
我曾经遇到过类似的问题,只有在集群服务器设置中管理员将 MaxUserPort 注册表键值设置为 65534 时才得以解决。[该问题仅发生在集群服务器设置中] 参考资料
  1. MaxUserPort - 它是什么,它的作用是什么,何时非常重要
  2. 间歇性的 msdtc 问题

其他参考资料

  1. DTCPing:解决 MSDTC 连接问题
  2. “与底层事务管理器的通信失败”错误消息
  3. Windows 防火墙阻止 MSDTC
  4. DTC 资源在集群上失败
  5. http://support.microsoft.com/kb/909444
  6. 解决 MSDTC 的问题
  7. 内核事务管理器
  8. MSDTC 客户端错误

1
作为有关 MSDTC 的进一步说明,请查看 MSDTC 的安全配置选项卡所设置的服务器,并确保您的本地计算机与其匹配。我曾遇到一个问题,让我困扰了一段时间,直到我这样做才发现服务器不需要身份验证,但我的本地计算机设置了双向身份验证。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接