0

テーブルのクエリと更新を行うストアド プロシージャを呼び出す BizTalk ソリューションがあります。負荷分散されたサーバーでソリューションをテストするたびに、このエラーが発生しているようです。

アダプターは、URL "mssql://server//StoredProc?" の送信ポート SQLAdapter_Sendport へのメッセージの送信に失敗しました。この送信ポートに指定された再試行間隔の後に再送信されます。

詳細: System.Transactions.TransactionManagerCommunicationException: 基になるトランザクション マネージャーとの通信に失敗しました。

System.Runtime.InteropServices.COMException: 通信の問題により、MSDTC トランザクション マネージャーはトランザクションを送信先のトランザクション マネージャーにプッシュできませんでした。考えられる原因は次のとおりです。ファイアウォールが存在し、MSDTC プロセスの例外がない、2 台のマシンが NetBIOS 名で互いを検出できない、またはネットワーク トランザクションのサポートが 2 つのトランザクション マネージャーのいずれかで有効になっていない。

HRESULT からの例外:
System.Transactions.Oletx.ITransactionShim.Export(UInt32 whereaboutsSize, Byte[] whereabouts, Int32& cookieIndex, UInt32& cookieSize, CoTaskMemHandle& cookieBuffer)
で System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts) からの例外: 0x8004D02A) )
--- 内部例外スタック トレースの終了 ---

以下のように DTC プロパティを設定する必要があるという記事をいくつか読みました。これらは、BizTalk と SQL Server の両方で既に設定しています。

ここに画像の説明を入力

また、Windows ファイアウォールに DTC を追加する必要があります。

ここに画像の説明を入力

最後に、Send Port プロパティの useAmbientTransaction が True に設定されている場合、上記のエラーが引き続き発生します。

ここに画像の説明を入力

しかし、useAmbientTransaction を False に設定すると、メッセージは SQL で成功します。

特にストアド プロシージャに Update と Delete が含まれている場合、Microsoft は useAmbientTransaction を False に設定することを推奨していないという記事を読んだことがあります。しかし、私のソリューションでは、ストアド プロシージャで削除と更新を使用しているため、useAmbientTransaction を True に設定する必要があります。しかし、そうすると、「MSDTC トランザクション マネージャーはトランザクションを宛先にプッシュできませんでした...」というエラーが引き続き発生します。

これに対する可能な解決策を提案してください。

4

1 に答える 1

1

AlwaysOn 可用性グループ内のデータベースに接続している場合は、SQL Server 2016 を除いて AlwaysOn が MSDTC をサポートしていないため、useAmbientTransaction をオフにする必要があります。

データベース ミラーリングまたは AlwaysOn 可用性グループ (SQL Server) でサポートされていないSQL Server 2014クロスデータベース トランザクションの同じ記事

Always On 可用性グループとデータベース ミラーリングのためのSQL Server 2016クロスデータベース トランザクションと分散トランザクション (SQL Server)

于 2016-10-27T01:02:33.820 に答える