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' にプロポゲートできませんでした"
Note
このデータでは、 propogation という単語は、 propagation という単語のスペルミスです。 propogate という単語は、propagate という単語のスペルミスです。
MS DTC トランザクション トレース ログ ファイルにこのデータが含まれている場合は、次の手順に従います。
[スタート] ボタンを選択し、[ファイル名を指定して実行] を選択します。次に、「regedit」と入力し、[OK] を選択します。
次のレジストリ サブキーを見つけます。
HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC
MSDTC を右クリックし、New をポイントし、DWORD 値を選択します。「 CmMaxNumberBindRetries」と入力し、Enter キーを押します。
CmMaxNumberBindRetriesを右クリックし、Modify を選択します。
Decimal を選択します。
[ Value data ボックスに「 60」と入力します。
この値により、クライアント コンピューターがサーバー コンピューターからのバインド パケット応答を待機する時間が長くなります。 この値は、クライアント コンピューターがバインド パケット応答を受信しない場合に、クライアント コンピューターがトランザクションを停止するまでの秒数の 2 倍です。 たとえば、60 の値は 30 秒です。 値 60 は、推奨される値にすぎません。 構成に対する追加のテストが必要になる場合があります。
[OK] を選択します。
MS DTC を再起動します。
Note
応答が遅いシナリオでは、ファイアウォールが境界ネットワークに関係している場合に、Kerberos 認証に必要なポート (UDP 88 および伝送制御プロトコル (TCP) 88) が開いていることを確認します。 ポート UDP 389 と TCP 389 (両方ともライトウェイト ディレクトリ アクセス プロトコル (LDAP) のキー配布センター (KDC) を検索する) も開いている必要があります。