MSDTC事务管理器无法使用AmbientTransaction推送事务

时间:2016-10-11 09:31:27

标签: biztalk distributed-transactions msdtc sqlbindparameter

我有一个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中都设置了。

enter image description here

此外,必须在Windows防火墙中添加DTC。

enter image description here

最后,如果Send Port属性中的useAmbientTransaction设置为True,我会遇到上述错误。

enter image description here

但是如果我将useAmbientTransaction设置为False,则消息在SQL中成功。

我在某篇文章中读过,微软并不建议将useAmbientTransaction设置为False,尤其是在存储过程中涉及更新和删除的情况下。但是我的解决方案在存储过程中使用了删除和更新,这就是为什么我需要将useAmbientTransaction设置为True。但如果我这样做,我会遇到错误" MSDTC交易管理器无法将交易推送到目的地......"

请为此建议任何可能的解决方案。

1 个答案:

答案 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)