27

我收到错误:

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

当我尝试从 Visual Studio 2010 运行我的应用程序时。我在谷歌上搜索了这个问题,我已经尝试了所有可能的解决方案来解决这个错误。

在这里,我对我的 DTC 属性进行了更改。

-- Network DTC Access
-- Allow Inbound
-- Allow Outbound
-- Allow Remote Administrator
-- Allow Remote Clients
-- No Authentication Required
-- Enable XA Transaction
-- Enable SNA LU 6.2 Transaction

请让我知道,如果有人知道这个问题的解决方案。

谢谢 Manoj Sitapara

4

4 回答 4

35

尝试允许 DTC 通过防火墙进行通信。

在此处输入图像描述

于 2014-02-12T21:16:42.280 回答
16

DTCPing在分布式事务涉及的所有计算机上下载并运行它。

大多数情况下,它会为您提供确切的错误和问题所在(如相同的 CID)等。

可能的原因:

  1. 通过 NetBIOS 名称无法访问计算机。在这种情况下,您必须调整他们的hosts文件以添加映射 IP/主机名,或者,如果在域中,则为他们添加 DNS 别名。
  2. 服务器是虚拟机,它们是从同一个虚拟机实例克隆的。在这种情况下,MSDTC CID 是相同的,您需要安装/重新安装 MSDTC(DTCping 会告诉您这一点)。
于 2012-07-06T05:20:50.527 回答
5

查看MSDTC 故障排除指南,其中将重复的 CID 列为潜在问题。您可以使用以下 Powershell 脚本检测重复的 CID 并在需要时使用 WinRM 重新安装 MSDTC:

write-host "Checking for duplicate CIDs and reinstalling MSDTC if needed."
$servers = "server1","server2","server3"
$CIDs = Invoke-Command -ComputerName $servers -ScriptBlock { gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { $_.Name } | Out-String -Stream } #Array of all CIDs on all servers
$UniqueCIDs = $CIDs | select -Unique
if($CIDs.Length -eq $UniqueCIDs.Length){
    Write-Output "All CIDs are unique, so we don't need to reinstall MSDTC"
} else {
    Write-Output "Found duplicate CIDs, so we need to reinstall MSDTC on all VMs"
    Invoke-Command -ComputerName $servers -ScriptBlock {
        write-output "`r`nUninstalling MSDTC to regenerate CIDs on $env:computername" 
        msdtc -uninstall | Write-Output
        sleep 25 #wait for previous command to finish
        write-output "`r`nReinstalling MSDTC to regenerate CIDs on $env:computername" 
        msdtc -install  | Write-Output
        sleep 25 #wait for previous command to finish
        write-output "`r`nSetting MSDTC service to automatic on $env:computername" 
        Set-Service msdtc -startuptype "auto"
        write-output "`r`nWARNING: $env:computername may need to be restarted for changes to take effect." 
    }
}
于 2013-05-29T18:32:46.547 回答
0

尝试在群集上设置 DTC 和 MSMQ 时出现通信失败错误。在我的情况下,潜在的错误是“内存不足”。我能够将事务消息从集群发送到另一台服务器,但不能从该服务器发送回集群。我的服务会抛出这个异常:

System.Transactions.TransactionAbortedException: The transaction has aborted. 
---> System.Transactions.TransactionManagerCommunicationException: Communication 
with the underlying transaction manager has failed. ---> 
System.Runtime.InteropServices.COMException: Ran out of memory (Exception from HRESULT: 0x80000002)

这篇文章有一个非常模糊的解决方案:http: //www.nervousadmin.com/category/microsoft/windows/dtc/

总结一下:

HKLM\Cluster\ResourceTypes\Distributed Transaction Coordinator 下的注册表项 ClusterDefaultResource 的 guid 需要与 DTC 服务的可执行文件路径上的 guid 参数对齐。

此问题的另一个症状是,如果您尝试通过组件服务管理控制台访问 DTC 属性,则会收到内存不足错误。查看 Component Services/Computers/My Computer/Distributed Transaction Coordinator 下的控制台树,然后右键单击其中列出的每个 DTC。如果您的指南未对齐,这将引发错误。

  • 打开 services.msc。找到分布式事务协调器(如果有两个,您正在寻找名称中带有 guid 的那个)
  • 打开该 DTC 的属性。从“可执行文件路径”复制 guid
  • 打开注册表。查找 HKLM\Cluster\ResourceTypes\Distributed Transaction Coordinator
  • 将 ClusterDefaultResource 值与您复制的 guid 进行比较。如果它们不同,下一步应该解决问题。如果没有,这不是你的答案。
  • 备份当前值。编辑 ClusterDefaultResource 属性:粘贴您从 services.msc DTC 属性复制的 guid。您需要在集群中的每个节点上执行此操作。
  • 幸运的是,这解决了你的问题。
于 2018-01-15T16:48:01.053 回答