MS DTC でトランザクションを開始しようとすると、指定したトランザクション コーディネーターに新しいトランザクションを参加できません

この記事は、Microsoft 分散トランザクション コーディネーター (MS DTC) でトランザクションを開始するときの問題を解決するのに役立ちます。

元の製品バージョン: Windows
元の KB 番号: 922430

重要

この資料には、レジストリの編集方法が記載されています。 レジストリを変更する前にレジストリのバックアップを必ず作成してください。 また、問題が発生した場合に備えて、レジストリの復元方法を理解しておいてください。 レジストリをバックアップ、復元、変更する方法の詳細については、「 高度なユーザー向けの Windows レジストリ情報」を参照してください。

現象

次のような状況で問題が発生します。

  • サーバー コンピューターと通信するクライアント コンピューターがあります。
  • MS DTC は両方のコンピューターにインストールされます。
  • 次の条件のうち 1 つ以上が当てはまります。
    • いずれかのコンピューターを再起動します。
    • いずれかのコンピューターで MS DTC を再起動します。
    • コンピューターは異なるドメインにあります。

このシナリオでは、MS DTC でトランザクションを開始しようとすると、次のエラー メッセージが表示されます。

指定したトランザクション コーディネーターに新しいトランザクションを参加させることはできません (0x8004d00a)

さらに、最初のトランザクションは失敗します。 後続のトランザクションはしばらく成功します。 ただし、後続のトランザクションは再び失敗する可能性があります。 後続のトランザクションが失敗すると、次のエラー メッセージが表示されます。

指定したトランザクション コーディネーターに新しいトランザクションを参加させることはできません (0x8004d00e)

原因

この問題は、クライアント コンピューターとサーバー コンピューターの間の MS DTC 接続が閉じられたときに発生する可能性があります。 たとえば、アイドル タイムアウト、リモート プロシージャ コール (RPC) のタイムアウト、ファイアウォールはクライアント コンピューターとサーバー コンピューターの間の MS DTC 接続を閉じることがあります。 新しいトランザクション要求が発生した場合、クライアント コンピューターは、サーバー コンピューターとの MS DTC 接続を再確立する必要があります。

クライアント コンピューターがサーバー コンピューターとの MS DTC 接続を再確立しようとすると、クライアント コンピューターはパケットを送信します。 次に、クライアント コンピューターは、サーバー コンピューターからのバインド パケット応答を待機します。 既定では、クライアント コンピューターが 4 秒でサーバー コンピューターから応答を受け取らない場合、クライアント コンピューターはトランザクションを停止します。 ネットワーク待機時間の問題や認証の遅延により、サーバー コンピューターからの応答が遅れる可能性があります。 サーバー コンピューターからの応答が最終的にクライアント コンピューターに到達すると、後続のトランザクションは成功します。

最初のトランザクションには時間がかかる場合があり、その後、分散トランザクションを実行するための後の要求がすぐに完了する場合があります。 この問題は、MS DTC のクライアント側で Kerberos (KDC) サーバーとの通信に問題がある場合に発生する可能性があります。 通常、この問題は、クライアントとサーバーの間にファイアウォールがある異なるドメインにある場合に発生します。

たとえば、この問題は次のシナリオで発生します。

  • Web サービスは、ドメイン内の境界ネットワークにあります。 Web サービスでは、イントラネット内の別のドメイン内のデータベース サーバーとのトランザクションを使用する必要があります。
  • ファイアウォールは境界ネットワークとイントラネットの間にあります。 ユーザー データグラム プロトコル (UDP) ポート 88 (Kerberos) がブロックされているため、最初のトランザクションで過剰な遅延が発生します。
  • Kerberos 要求の再試行と再試行間隔は、過剰な遅延 (100 秒以上) と等しくなります。

解決方法

警告

レジストリ エディタや他の方法を使用してレジストリを変更する際、適切に変更しないと重大な問題を引き起こす可能性があります。 このような問題が発生した場合は、オペレーティング システムの再インストールが必要になることがあります。 こうした問題の修復について、マイクロソフトはいかなる保証もいたしません。 レジストリの変更はユーザー自身の責任において行ってください。

この記事で説明されている問題が発生していることを確認するには、MS DTC トランザクション トレース ログ ファイルに次のデータが含まれていることを確認します。

;eventid=TRANSACTION_PROPOGATION_FAILED_CONNECTION_DOWN_FROM_REMOTE_TM;tx_guid=f11cd9c9-7b8a-41e3-a904-4840123bacf7 ;"リモート トランザクション マネージャーとの接続がダウンしたため、トランザクションを子ノード ' ComputerName ' にプロポゲートできませんでした"

注:

このデータでは、単語のプロポゲーションは単語伝達のスペルミスです。 propogate という単語は、単語伝達のスペルミスです

MS DTC トランザクション トレース ログ ファイルにこのデータが含まれている場合は、次の手順に従います。

  1. [スタート] ボタンを選択し、[ファイル名を指定して実行] を選択します。次に、「regedit」と入力し、[OK] を選択します。

  2. 次のレジストリ サブキーを見つけます。
    HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC

  3. MSDTC を右クリックし、[新規] をポイントし、[DWORD 値] を選択します。

  4. 「CmMaxNumberBindRetries」と入力し、Enter キーを押します。

  5. [CmMaxNumberBindRetries] を右クリックし、[変更] を選択します。

  6. [ Decimal] を選択します。

  7. [ 値データ ] ボックスに「 60」と入力します。

    この値により、クライアント コンピューターがサーバー コンピューターからのバインド パケット応答を待機する時間が長くなります。 この値は、クライアント コンピューターがバインド パケット応答を受け取らない場合に、クライアント コンピューターがトランザクションを停止するまでの秒数の 2 倍です。 たとえば、値 60 は 30 秒です。 値 60 は推奨値のみです。 構成に関する追加のテストが必要になる場合があります。

  8. [OK] を選択します。

  9. MS DTC を再起動します。

注:

応答速度が遅いシナリオでは、ファイアウォールが境界ネットワークに関係している場合に、Kerberos 認証で必要なポート (UDP 88 および伝送制御プロトコル (TCP) 88) が開いていることを確認します。 ポート UDP 389 と TCP 389 (どちらもライトウェイト ディレクトリ アクセス プロトコル (LDAP) の場合はキー配布センター (KDC) を検索する) も開いている必要があります。