2010/01/16

2フェーズ・コミットとインダウト・トランザクション

2フェーズ・コミット

2フェーズ・コミットは準備フェーズ、コミットフェーズの2つのフェーズでトランザクションを処理することでトランザクションの原子性を保障するメカニズムです。

■ 2フェーズ・コミットを採用しない場合
2フェーズ・コミットを採用しない場合、下図のように原子性が保障できません。






■ 2フェーズ・コミットでは
2フェーズ・コミットでは、準備フェーズでDBはコミット準備を行いトランザクション・マネージャへコミット可能票を投票し、コミットフェーズで全てのDBがコミット可能票を投票した場合コミットします。
拒否票が1票でも投票された場合はロールバックします。

2フェーズ・コミットでは、このように2つのフェーズでトランザクションの原子性を保障します。



※図中の不確定区間(インダウト)はコミット/ロールバックのどちらを行うかが確定していない区間を指します。



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

2フェーズ・コミットのコミットフェーズで障害が発生した場合、DBのトランザクションがコミット/ロールバックが確定しないインダウト状態となります。
このインダウト状態が発生したトランザクションをインダウト・トランザクションと言います。
インダウト・トランザクションはリカバリするまでアクセスしていたデータをロックし続けます。そのため早期な検出、リカバリが必要になります。

下図ではDB2でインダウト状態が発生しています。



MSDTC×Oracleの環境ではOracle MTS Recovery Service、リカバリ・ジョブ(DBMS_JOBパッケージで登録するジョブ)で自動リカバリを実現します。
MSDTC×Oracleの自動リカバリについてはいずれ詳細をPOSTします。

0 件のコメント:

コメントを投稿