[PRB] MSDTC のセッション タイムアウトとトランザクション要求が競合する

概要
Microsoft 分散トランザクション コーディネータ (以下 MSDTC) を使用して分散トランザクションを実行しているとき、ある状況下でトランザクションが失敗し、次のエラーがアプリケーションに返されることがあります。
0x8004D00A XACT_E_NOENLIST
指定されたトランザクション コーディネータに、新規トランザクションを参加できませんでした。

0x8004D01C XACT_E_CONNECTION_DOWN
トランザクション マネージャへの接続に失敗しました。

0x8004D00E XACT_E_NOTRANSACTION
トランザクションをインポートできませんでした
詳細
この問題は、MSDTC のセッション タイムアウトと新規トランザクション要求が同時に発生した場合に起こる事があります。

MSDTC はセッション タイムアウトの監視と実際の RPC 通信を別スレッドで行っています。セッション タイムアウトが発生してから実際に RPC 通信が切断されるまでの間には、ごく短時間の遷移期間があり、この期間中に新たなトランザクション要求が発生すると上記のエラーによりトランザクションが失敗します。

なお MSDTC のセッション タイムアウトが発生すると、イベント ログに以下のようなエントリが記録されます。

ソース: MSDTC
分類: CM
イベントID: 4156
Session idle timeout over, tearing down the session

ソース: MSDTC Client
分類: CM
イベントID: 4156
Session idle timeout over, tearing down the session.
解決方法
これを回避するには、分散トランザクションに関与する全てのマシン上で MSDTC のセッション タイムアウトを十分長い時間に設定し、トランザクション要求との間で競合が発生しないようにします。

MSDTC のセッション タイムアウトの時間を変更するには、次の手順を実行します。 
  1. MSDTC サービスを停止します。コンポーネント サービス上で動作する COM+ アプリケーション、Microsoft SQL Server、Microsoft Message Queue Server (MSMQ)、Microsoft COM Transaction Integrator (COMTI) など、MSDTC に依存しているサービスも停止していることを確認して下さい。
  2. REGEDIT.EXE を起動して下さい。
  3. HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC に以下の新しいキー (REG_DWORD) を追加して下さい。
    CmMaxIdlePings
  4. 追加したキー (CmMaxIdlePings) に値を設定して下さい。設定可能な値の範囲は次の通りです。
    HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC\CmMaxIdlePings
    設定可能な値の範囲: 1 to 0xFFFFFFFF

    CmMaxIdlePings のデフォルト値は 100 回です。セッションの接続状況の確認は 6 秒間隔で行われますので、デフォルトでは 600 秒に設定されています。ここでは競合を避けるために十分に長い任意の値を設定してください。例えば 0xFFFFFFFF を設定すれば事実上セッション タイムアウトは発生しなくなります。
  5. REGEDIT.EXE を終了します。
状況
マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト製品の問題として認識しています。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:827773 - 最終更新日: 09/29/2016 16:19:00 - リビジョン: 5.0

Microsoft COM+ 1.0, Microsoft COM+ 1.5, Microsoft COM+ 2.0 Standard Edition

  • kbbug KB827773
フィードバック