ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server Express Java EE運用ガイド(Java EE 6編)
FUJITSU Software

2.15.3 2フェーズコミットプロトコル

2フェーズコミットプロトコルは、グローバルトランザクションに登録された複数のリソースの一貫性を保証するメカニズムです。2フェーズコミットプロトコルはコミット処理を2つのフェーズで実行して、一貫性を保証します。最初のフェーズは、準備フェーズと呼ばれます。トランザクションマネージャは、各リソースマネージャに対してトランザクション作業をコミットする準備ができているかどうかを確認します。作業をコミットできるリソースマネージャは、コミット可能であるということを通知します。すべてのリソースマネージャがコミット可能であることを確認後に、リソースマネージャに対してコミット処理を行います。準備フェーズでコミットできないリソースマネージャが存在する場合には、トランザクションをロールバックします。

トランザクションを要求するJava EEコンポーネントは、Interstageの2フェーズコミットメカニズムを意識する必要がありません。Java EEコンポーネントは、ローカルトランザクションを使用する場合と同様のトランザクション制御を行うことで、2フェーズコミットの処理はコンテナが自動的に行います。

2フェーズコミットプロトコルでは、システム障害時に結果の原子性を保証するため、トランザクションマネージャはトランザクションの進捗状況を記録します。この進捗状況を記録するログをトランザクションログと呼びます。詳細は、「2.15.5 トランザクションログ」を参照してください。

Use Last Agent Optimization

トランザクションサービスでuse-last-agent-optimizationプロパティにtrueを指定した場合(デフォルトはtrue)、複数のリソースを使用した場合でも1つだけ非XAリソースを使用できます。トランザクションに登録されたXAリソースに対して準備フェーズを実行し、すべてのXAリソースからコミット可能であるという通知を受けると、トランザクションサービスは非XAリソースに対して1フェーズコミットを実行します。非XAリソースに対する1フェーズコミットが成功した場合、XAリソースに対してコミットフェーズを実行します。非XAリソースに対する1フェーズコミットが失敗した場合、XAリソースに対してロールバックされます。

詳細は、「7.7.13 トランザクションサービスの定義項目」を参照してください。また、トランザクションサービスの設定はasadminコマンドでも設定できます。

注意

複数プロセス間でトランザクション連携する場合、Use Last Agent Optimizationは無効になりますので、すべてのリソースはXAリソースを使用してください。

インダウトトランザクション

2フェーズコミットプロトコルでは、すべてのリソースマネージャがコミット可能であることを確認後に、リソースマネージャに対してコミット処理を行うため、複数のリソースを使った場合の原子性が向上します。しかし、準備フェーズですべてのリソースマネージャがコミット可能であることを通知した後に、以下の理由によりコミットフェーズが失敗する可能性があります。この場合、コミットフェーズが失敗したトランザクションをインダウトトランザクションと呼びます。

インダウトトランザクションは、以下のどちらかで回復処理を行います。

自動回復

IJServerクラスタ起動時にインダウト状態のトランザクションに対して自動的に回復処理を実行します。自動的に回復処理を実行する場合には、asadminコマンドのsetサブコマンドでautomatic-recoveryをtrueに設定してください。次回IJServerクラスタ起動時から有効になります。
トランザクションサービス定義の詳細は、「7.7.13 トランザクションサービスの定義項目」を参照してください。

手動回復

asadminコマンドの「9.1.13.3 recover-transactionsサブコマンド」を実行することで、トランザクションマネージャが管理しているインダウトトランザクションの回復処理を行います。

また、グローバルトランザクションをサポートする各データベースでは、インダウトトランザクションを手動で回復する手段について説明されています。使用するデータベースのマニュアルを参照してください。

注意

手動回復処理では、サーバーインスタンスが起動状態で発生したインダウトトランザクションを回復します。

サーバーインスタンスが再起動された場合、再起動前に発生したインダウトトランザクションは回復されません。再起動前に発生したインダウトトランザクションを回復したい場合は、自動回復処理を使用してください。

回復処理が実行されると、トランザクションマネージャは登録されているXAリソースに対してrecoverメソッドを呼び出し、インダウト状態のリソースに対してコミットまたはロールバック処理を実行してトランザクションを回復します。