MSDTC在第一次事务中失败

3
我有一个应用程序,每天从数据库中检索数据并存储。最近,由于一些必需外设的硬件问题,该应用程序已经移动到运行Windows XP的单独机器上,而不是与SQL服务器驻留在同一台机器上。
我们遇到的问题是,在早晨运行第一笔交易时,我们会收到以下堆栈跟踪:
System.Transactions.TransactionManagerCommunicationException: 与底层事务管理器的通信失败。---> System.Runtime.InteropServices.COMException (0x80004005): 从调用COM组件返回了错误HRESULT E_FAIL。
然而,立即重新运行交易就成功了。似乎MSDTC对第一笔交易反应过慢,因此会失败,但随后准备好了第二笔交易。我在互联网上找到了几个这种情况的参考,但没有找到真正的解决方案。是否有人遇到过这种情况?如果是,是否有一种方法可以防止MSDTC从内存中卸载或者有其他解决方案,例如延长超时时间?
6个回答

1

谢谢大家,

简单说明一下,我们通过更改dcom配置来使用位于SQL服务器上的远程协调器解决了问题,到目前为止我们没有遇到任何其他问题。


0
我们在测试环境中遇到了类似的问题。在10分钟的不活动后,第一次事务失败,并显示“与底层事务管理器的通信失败”的错误。
经过一些研究,我们得出结论,MSDTC连接被取消,并且无法在所需的时间内建立(似乎此操作的默认超时时间为4秒)。 为了解决这个问题,我们增加了客户端计算机等待从服务器计算机接收绑定数据包响应的时间长度。这是通过在客户端计算机的注册表中添加一个键来完成的:http://support2.microsoft.com/?id=922430

0

我建议您首先查看所有涉及机器的事件日志,看看还有什么其他信息。您正在做一个关于发生了什么的假设。这可能是一个好的假设,但我建议在进行更改之前弄清楚。

我也会开始将这个问题转移到ServerFault,那里您可能会得到更快的答案。如果需要太长时间(需要五个人投票),那么您可能需要手动去那里提问。如果您这样做,请指出原始问题(并粘贴链接)可能正在途中。


0

有一件事情需要关注(虽然它可能不是你的问题的原因),就是确保客户端IP的反向DNS查找实际上解析为指向客户端机器的名称。我们在DNS/DHCP设置中遇到了问题,其中一个IP匹配了多个名称。当MSDTC的远程端试图连接回客户端上的MSDTC时,它尝试连接到不同的机器。

这将表现为(看似随机的)交易超时。


0

哦,亲爱的,我们也遇到了同样的问题。我们正在从一个数据库迁移数据到另一个(具有不同结构),并使用Subsonic来加速该过程。我们使用了事务和SharedDbConnectionScope对象,在运行XP SP3的机器上失败了。我认为SP3中有一些更新会破坏事情,因为它在Vista、2003和2008服务器上运行良好。

编辑:这里有一个MSDN KB文章,讨论了同样的问题。


0

你可以尝试每隔30分钟运行一个进程,该进程仅在DTC上启动并提交一个事务?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接