尝试在 MS DTC 中启动事务时,新事务无法在指定的事务协调器中登记
本文可帮助解决在Microsoft分布式事务处理协调器(MS DTC)中启动事务时出现的问题。
原始产品版本: Windows
原始 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”,因为与远程事务管理器的连接已关闭”
注意
在此数据中,词传播是拼写错误的单词传播。 词的传播是拼写错误的单词。
如果 MS DTC 事务日志文件包含此数据,请执行以下步骤:
依次选择“开始”、“运行”,键入 regedit,然后选择“确定”。
找到以下注册表子项:
HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC
右键单击 MSDTC,指向“新建”,然后选择“DWORD 值”。
键入 CmMaxNumberBindRetries,然后按 Enter。
右键单击 CmMaxNumberBindRetries,然后选择“ 修改”。
选择 十进制。
在 “值”数据 框中,键入 60。
此值会增加客户端计算机等待来自服务器计算机的绑定数据包响应的时间长度。 如果客户端计算机未收到绑定数据包响应,则此值是客户端计算机停止事务之前的秒数。 例如,值为 60 等于 30 秒。 值 60 只是建议的值。 可能需要对配置进行其他测试。
选择“确定”。
重启 MS DTC。
注意
对于慢速响应方案,请确保当外围网络涉及防火墙时,Kerberos 身份验证(UDP 88 和传输控制协议(TCP)88 所需的端口处于打开状态。 端口 UDP 389 和 TCP 389(同时对于轻型目录访问协议(LDAP)必须打开才能查找密钥分发中心(KDC)。