今やシステムとデータベースの関係はN:Nが当たり前だ。アーキテクトが外せないデータベースの関連知識の筆頭がトランザクションの整合性に欠かせない「ツーフェーズ」という考え方だ。非常に強力な半面、使いすぎるとシステム運用が硬直化する恐れがある。適切に使うコツをつかみたい。

 一般的なオープン系のトランザクションはデータベースを中心に考えられており、その排他制御はRDBMSのRM(Resource Manager)機能が担っている。現在のICTシステムでは特定のデータベースを多様な処理形態で共有したり、複数のデータベースを同時に扱ったり、データベースとメッセージキューのトランザクション同期が必要になるケースがある。ここで必要なのが、データベースなどの特定のリソースに対する排他制御である「ツーフェーズロック」と、その上位で複数のリソースを対象に整合性を制御する「ツーフェーズコミット」である。

トランザクション内の整合性

 オープン系システムでは、一連の処理の中でデータ更新の整合性をとる単位をトランザクションと呼ぶ。トランザクションは初回のレコード参照で始まり、コミット(確定)で終わる。トランザクションの中で参照・追加されたレコードは、当該トランザクションが「占有」し、他のトランザクションが同一レコードを参照しようとしても待たされる。これにより、トランザクション単位の一貫性が保証されるというわけだ。

 とはいえ、参照主体のレコードや、テーブル内の全レコードを検索する処理もあり、そうした場合にトランザクションがレコードを参照するだけなのに「占有」してしまうのはいささか不都合だ。そこで 参照する場合は占有のほかに「共有」や「非占有」といった隔離性(Isolation)レベルを設け、占有・共有のレコードを対象にトランザクション制御を実施することが一般的になった。こうしたコミットによる一括占有解放型の排他制御こそがツーフェーズロックである。