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

时间:2011-09-01 21:20:55

标签: c# .net wcf msdtc

我有一个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 env时,服务器和客户端在不同的机器上,每当调用scope.Complete()时,客户端会挂起超时(2分钟)然后我得到:

  

流动的交易无法解开。下列   发生异常:与底层事务管理器通信   失败了。

导致这种情况的原因是什么?

4 个答案:

答案 0 :(得分:9)

我今天花了几个小时试图在Windows 7下解决这个问题。最后它起作用了,这就是我做的:

  1. 启用MSDTC并允许入站/出站交易(通过控制面板)
  2. The guide for opening ports via registry - 只需按照指南
  3. 允许在防火墙中打开(2)中定义的端口(如果您使用的话)
  4. 允许MSDTC通过Windows防火墙 - 为msdtc.exe的入站连接添加新规则(应该在%systemroot%\ system32中)
  5. 这可能不是最好的解决方案,但实际上是我唯一能解决的问题。

    编辑:在Windows 7 SP1下MSDTC的另一个问题之后,我发现为了使其工作,您需要做两件事。

    1. 添加到hosts文件中的IP和NetBIOS名称之间的映射 服务器
    2. 在HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows NT \ RPC中添加(或编辑)两个键: “RestrictRemoteClients的”= DWORD:00000000 “了EnableAuthEpResolution”= DWORD:00000000

答案 1 :(得分:1)

作为MSDTC的进一步说明,请参阅MSDTC的“安全配置”选项卡在服务器上设置的内容,并确保本地计算机与此匹配。我遇到了一个困扰我一段时间的问题,直到我这样做了,发现服务器没有进行身份验证,但我的本地机器设置为相互身份验证。

答案 2 :(得分:1)

答案 3 :(得分:0)

您应该在DTC配置中为分布式事务启用网络事务和其他设置。

检查一下,标有绿色图标的答案会告诉您详细说明:

"Communication with the underlying transaction manager has failed" error message