我有一个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 [] whereabouts,Int32& cookieIndex,UInt32& cookieSize,CoTaskMemHandle& cookieBuffer)
在System.Transactions.TransactionInterop.GetExportCookie(交易交易,字节[]所在地)
---内部异常堆栈跟踪结束---
我已经阅读了一些我应该如下设置DTC属性的文章。这些我已经在BizTalk和SQL Server中都设置了。
此外,必须在Windows防火墙中添加DTC。
最后,如果Send Port属性中的useAmbientTransaction设置为True,我会遇到上述错误。
但是如果我将useAmbientTransaction设置为False,则消息在SQL中成功。
我在某篇文章中读过,微软并不建议将useAmbientTransaction设置为False,尤其是在存储过程中涉及更新和删除的情况下。但是我的解决方案在存储过程中使用了删除和更新,这就是为什么我需要将useAmbientTransaction设置为True。但如果我这样做,我会遇到错误" MSDTC交易管理器无法将交易推送到目的地......"
请为此建议任何可能的解决方案。
答案 0 :(得分:1)
如果要连接到AlwaysOn可用性组中的数据库,则需要关闭useAmbientTransaction,因为AlwaysOn不支持除SQL Server 2016之外的MSDTC。
SQL Server 2014的同一篇文章Cross-Database Transactions Not Supported For Database Mirroring or AlwaysOn Availability Groups (SQL Server)
VS
SQL Server 2016 Cross-Database Transactions and Distributed Transactions for Always On Availability Groups and Database Mirroring (SQL Server)