【发布时间】:2017-02-19 19:40:26
【问题描述】:
我有一个 BizTalk 解决方案,它会调用一个存储过程来查询和更新表。显然,每次我在负载平衡服务器中测试我的解决方案时都会遇到此错误。
适配器未能传输要发送端口“SQLAdapter_Sendport”的消息,URL 为“mssql://server//StoredProc?”。将在为此发送端口指定的重试间隔后重新传输。
详情:System.Transactions.TransactionManagerCommunicationException:与底层事务管理器的通信失败。
System.Runtime.InteropServices.COMException:由于通信问题,MSDTC 事务管理器无法将事务推送到目标事务管理器。可能的原因是:存在防火墙并且它对 MSDTC 进程没有异常,两台机器无法通过它们的 NetBIOS 名称找到彼此,或者两个事务管理器之一未启用对网络事务的支持。
来自 HRESULT 的异常:0x8004D02A)
在 System.Transactions.Oletx.ITransactionShim.Export(UInt32 whereaboutsSize, Byte[] 下落, Int32& cookieIndex, UInt32& cookieSize, CoTaskMemHandle& cookieBuffer)
在 System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] 行踪)
--- 内部异常堆栈跟踪结束 ---
我读过一些文章,我应该如下设置 DTC 属性。这些我已经在 BizTalk 和 SQL Server 中设置了。
DTC 也必须添加到 Windows 防火墙中。
最后,如果发送端口属性中的 useAmbientTransaction 设置为 True,我会一直遇到上述错误。
但如果我将 useAmbientTransaction 设置为 False,则消息在 SQL 中成功。
我在一些文章中读到,Microsoft 不建议将 useAmbientTransaction 设置为 False,尤其是在存储过程中涉及 Update 和 Delete 的情况下。但是我的解决方案在存储过程中使用了删除和更新,这就是为什么我需要将 useAmbientTransaction 设置为 True。但是,如果我这样做,我会不断遇到错误“MSDTC 事务管理器无法将事务推送到目的地...”
请为此提出任何可能的解决方案。
【问题讨论】:
-
您要连接的数据库是否配置为始终在线可用性组的一部分?附言如果您的问题是与 BizTalk 相关的问题,则使用 biztalk 标记问题会有所帮助。
标签: biztalk distributed-transactions msdtc sqlbindparameter