尝试在群集上设置 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。您需要在集群中的每个节点上执行此操作。
- 幸运的是,这解决了你的问题。