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 (キー配布センター (KDC) を検索するためのライトウェイト ディレクトリ アクセス プロトコル (LDAP) の両方) も開いている必要があります。