クラスタでDTCとMSMQを設定しようとしたときに、通信エラーが発生しました。私の場合、根本的なエラーは「メモリ不足」でした。クラスターから別のサーバーにトランザクションメッセージを送信できましたが、そのサーバーからクラスターに戻ることはできませんでした。私のサービスはこの例外をスローします:
System.Transactions.TransactionAbortedException: The transaction has aborted.
---> System.Transactions.TransactionManagerCommunicationException: Communication
with the underlying transaction manager has failed. --->
System.Runtime.InteropServices.COMException: Ran out of memory (Exception from HRESULT: 0x80000002)
この記事には非常にあいまいな解決策がありました:http://www.nervousadmin.com/category/microsoft/windows/dtc/
要約する:
レジストリのHKLM\Cluster \ ResourceTypes \ Distributed Transaction Coordinatorの下にあるキーClusterDefaultResourceのGUIDがあり、DTCサービスの実行可能ファイルへのパスのguid引数と一致する必要があります。
この問題のもう1つの症状は、コンポーネントサービス管理コンソールを介してDTCプロパティにアクセスしようとすると、メモリ不足エラーが発生することです。コンポーネントサービス/コンピューター/マイコンピューター/分散トランザクションコーディネーターの下のコンソールツリーを見て、そこにリストされている各DTCを右クリックします。GUIDが整列していない場合、これによりエラーがスローされます。
- services.mscを開きます。分散トランザクションコーディネーターを見つけます(2つある場合は、名前にGUIDが含まれているコーディネーターを探しています)
- そのDTCのプロパティを開きます。'パスから実行可能ファイル'にGUIDをコピーします
- regeditを開きます。HKLM \ Cluster \ ResourceTypes \ DistributedTransactionCoordinatorを検索します
- ClusterDefaultResource値をコピーしたGUIDと比較します。それらが異なる場合は、次のステップで修正する必要があります。そうでなければ、これはあなたの答えではありません。
- 現在の値をバックアップします。ClusterDefaultResourceプロパティを編集します。services.mscDTCプロパティからコピーしたGUIDを貼り付けます。クラスタ内の各ノードでこれを行う必要があります。
- 運が良ければ、これで問題は解決しました。