尝试在 MS DTC 中启动事务时,新事务无法在指定的事务协调器中登记

本文可帮助你解决在 Microsoft 分布式事务处理协调器 (MS DTC) 中启动事务时出现的问题。

原始产品版本: 窗户
原始 KB 编号: 922430

重要

本文包含有关如何修改注册表的信息。 修改注册表之前,一定要先进行备份。 并且一定要知道在发生问题时如何还原注册表。 有关如何备份、还原和修改注册表的详细信息,请参阅 高级用户的 Windows 注册表信息

症状

请考虑以下情况:

  • 你有一台与服务器计算机通信的客户端计算机。
  • MS DTC 安装在两台计算机上。
  • 以下一个或多个条件为 true:
    • 重启任一计算机。
    • 在任一计算机上重启 MS DTC。
    • 计算机位于不同的域中。

在这种情况下,尝试在 MS DTC 中启动事务时,会收到以下错误消息:

新事务无法在指定的事务协调器中登记 (0x8004d00a)

此外,第一个事务失败。 后续事务会成功一段时间。 但是,后续事务可能会再次失败。 如果后续事务失败,则会收到以下错误消息:

新事务无法在指定的事务协调器中登记 (0x8004d00e)

原因

当客户端计算机和服务器计算机之间的 MS DTC 连接关闭时,可能会出现此问题。 例如,空闲超时、远程过程调用 (RPC) 超时,或者防火墙可能会关闭客户端计算机和服务器计算机之间的 MS DTC 连接。 发生新的事务请求时,客户端计算机必须重新建立与服务器计算机的 MS DTC 连接。

当客户端计算机尝试重新建立与服务器计算机的 MS DTC 连接时,客户端计算机会发送数据包。 然后,客户端计算机等待来自服务器计算机的绑定数据包响应。 默认情况下,如果客户端计算机在 4 秒内未收到来自服务器计算机的响应,则客户端计算机将停止事务。 服务器计算机的响应可能会因为网络延迟问题或身份验证延迟而延迟。 当来自服务器计算机的响应最终到达客户端计算机时,后续事务会成功。

第一个事务可能需要很长时间,稍后执行分布式事务的请求可能会立即完成。 当 MS DTC 的客户端与 Kerberos (KDC) 服务器通信时,可能会出现此问题。 通常,如果客户端和服务器位于具有防火墙的不同域中,则会出现此问题。

例如,以下方案中会出现此问题:

  • Web 服务位于域中的外围网络中。 Web 服务必须对 Intranet 中另一个域中的数据库服务器使用事务。
  • 防火墙位于外围网络和 Intranet 之间。 由于用户数据报协议 (UDP) 端口 88 (Kerberos) 被阻止,因此第一个事务出现过度延迟。
  • Kerberos 请求的重试和重试间隔等于超过 100 秒 () 的过度延迟。

解决方案

警告

如果使用注册表编辑器或使用其他方法错误地修改了注册表,则可能会发生严重问题。 这些问题可能需要重新安装操作系统。 Microsoft 不能保证可以解决这些问题。 修改注册表的风险由您自行承担。

若要确保遇到本文中所述的问题,请确认 MS DTC 事务日志日志文件包含以下数据:

;eventid=TRANSACTION_PROPOGATION_FAILED_CONNECTION_DOWN_FROM_REMOTE_TM ;tx_guid=f11cd9c9-7b8a-41e3-a904-4840123bacf7 ;”无法将事务传送到子节点“ComputerName”,因为与远程事务管理器的连接已关闭”

注意

在此数据中,“ 传播 ”一词 是单词传播的拼写错误。 propogate 一词是单词传播的拼写错误。

如果 MS DTC 事务跟踪日志文件包含此数据,请执行以下步骤:

  1. 依次选择“开始”、“运行”,键入 regedit,然后选择“确定”

  2. 找到以下注册表子项:
    HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC

  3. 右键单击“ MSDTC”,指向 “新建”,然后选择“ DWORD 值”。

  4. 键入 CmMaxNumberBindRetries,然后按 Enter。

  5. 右键单击“ CmMaxNumberBindRetries”,然后选择“ 修改”。

  6. 选择“ 小数”。

  7. 在“ 值数据 ”框中,键入 60

    此值会增加客户端计算机等待来自服务器计算机的绑定数据包响应的时间长度。 如果客户端计算机未收到绑定数据包响应,则此值是客户端计算机停止事务前秒数的两倍。 例如,值 60 等于 30 秒。 值 60 只是建议的值。 可能需要对配置进行其他测试。

  8. 选择“确定”。

  9. 重启 MS DTC。

注意

对于慢速响应方案,请确保当外围网络中涉及防火墙时,Kerberos 身份验证 (UDP 88 和传输控制协议 (TCP) 88) 所需的端口处于打开状态。 用于轻型目录访问协议 (LDAP) 的端口 UDP 389 和 TCP 389 (也必须打开密钥分发中心 (KDC) ) 。