2フェーズコミット

■トランザクションの概念

データベースの更新処理としては INSERT文や UPDATE文、DELETE文などがあるが

複数の更新処理を連続して実行し、1つの関連性のある集まりとして簡易する場合、

トランザクションという概念が必要になる。

■トランザクションが必要になるケース

例えば商品を10個注文を受けたので在庫から商品を10個減らす場合、
注文テーブルに商品数を登録し、在庫テーブルから商品数を減らす。
もしトランザクションを使わずこの処理を続けて実行し、在庫から商

品を減らす処理に失敗した場合、注文数は登録した一方、在庫から商

品数が減らずデータ(商品個数)に不一致が発生する。

 

このようなケースではトランザクションを使うと問題を解決すること

ができる。上の例では注文と在庫の管理を1つのトランザクションと

してまとめ全ての更新に成功した場合のみ、商品の注文/在庫の個数

を確定する。もし処理が途中で失敗した場合、全ての処理が取り消さ

れる。このため商品在庫数に変動はなく、データの整合性が保たれる。

これらはACID特性と呼ばれるトランザクション処理の信頼性を保証

する性質である。

■分散トランザクションの問題

分散トランザクションとは1つのトランザクションが複数のデータベース

に対してアクセスするトランザクションのことである。先のケースのよう

なトランザクション機能では複数のデータベースに対してアクセスする場

合、図Aのように原始性を損なう問題があった。データベースBに対して

コミットが成功し、データベースCに対してコミットが失敗した場合、

データベースCに対してロールバックを実行してもデータベースBに対す

る変更までもロールバックできない事態が考えられる。

■分散トランザクション(2フェーズコミット)

先の分散トランザクションの問題を解決するのが図Bに示す2フェーズコミットである。

フェーズ1では各データベースに対してコミット可能か状態を確認する準備の指示を送る。

これを受けたデータベースはコミット可否をアプリケーションに伝える。コミットできる

状態であればアプリケーションに「準備完了」を伝える。もしコミットできない状態で

あればアプリケーションに対して「拒否」を伝える。

 

フェーズ2では、フェーズ1の各データベースの返答をもとにデータベースに対して

コミットかロールバックの決定を行う。

全てのデーターベースから「準備完了」の返答を受け取った場合のみ、各データベース

に対してコミットの指示を送る。この指示によってトランザクションがコミットされる。

しかし1つでも「拒否」の返答があった場合、全てのデータベースに対してロールバック

の指示を送る。

このように2フェーズコミットはコミットのための準備とコミット処理を行う実行を

分けることによってトランザクションの原始性を保証している。

■トランザクションマネージャ

先に説明した分散トランザクションを実行するにあたってアプリケーションからトランザ

クションの制御を切り離し別のコンポーネントに任せたトランザクションマネージャと呼

ばれるものを照会する。

 

 

トランザクションマネージャの導入により、アプリケーションから2フェーズコミットの処理が
隠ぺいされたことにより、分散トランザクションを単一のデータベースにおけるトランザクショ

ン処理と同様な手順でコミットできるようになる。

■X/OPENのDTPモデル

複数のデーターベースを利用する場合、そのインターフェースが統一されていないと連携が

とれない。X/OPENの分散トランザクションは、分散トランザクションに関するインター

フェースを標準化することでこの問題を解決することができる。

●アプリケーション

 システム利用者が高級言語で作成するプログラムのこと。

 

●トランザクションマネージャ

 トランザクションを管理し、データベースの更新情報をもとに一貫性を保守する。

 

●リソースマネージャ

 データベースのこと。

 

■TXインターフェース

 アプリケーションからトランザクションマネージャへトランザクションの開始/終了を指示する。

 

■XAインターフェース

 トランザクションマネージャとリソースマネージャでデータベースの更新情報の同期をとる。

 

■SQL

 データベースを操作するSQLのこと。

 

- おわり -