トランザクションを確定するには,COMMITの処理を行います。COMMITの実行方法はアプリケーションの開発言語や,使用するRDBMSによって若干異なることもありますが,RDBMS内部で行うCOMMIT処理の動作は基本的に同じです。

 RDBMSがCOMMITを指示されると,メモリー・バッファ内に作成されている,そのトランザクションのログ・データをトランザクションログ・ファイルに書き込みます(図1)。RDBMSはトランザクションのCOMMITを完了したら,そのトランザクション内の更新処理内容を保証する役目があります。たとえ障害などが発生しても,確実にリカバリできなければならない,という意味です。そのため,トランザクションログ・ファイルへのログ・データの書き込みは,確実にディスク上に保存できたことを確認してから,COMMIT処理を完了とします。

図1●トランザクションログの書き込み
図1●トランザクションログの書き込み

 トランザクション処理が確定すると,トランザクション内の更新SQL文も確定となります。よってこの時点で,第2回で説明した変更前のテーブル・データ(ROLLBACKされるかもしれないので保持していた更新SQL文の変更対象データ)は不要になりますので,RDBMSはこの変更前テーブル・データを無効にします。

 前回も少し触れましたが,RDBMSがCOMMIT処理のタイミングでディスク上に書き込むのはトランザクションログ・データだけです。更新SQL文によって更新されたテーブル・データはディスク上に書き込みません。

 「この動きは変だ」と思われる方もいるでしょう。トランザクションを完了すると,トランザクション内の更新SQL文の処理結果は保証しなければならない。ならば,更新SQL文の処理結果はディスクに書き込むべきではないか。

 この指摘は正しいですが,RDBMSはトランザクションの保証と同時に,処理性能も追求しなければなりません。処理性能を追求するにはディスク入出力を減らすことが効果的で,そのために,トランザクションが完了しても更新内容をディスクに書き込むことは行わないのです。この点は第5回でもう一度触れる予定です。

 では,更新されたテーブル・データはいつディスクに書き込まれるのでしょうか。それは「チェックポイント」と呼ぶタイミングになります。チェックポイントは,ある一定間隔で発生する場合と,メモリー・バッファ内の確定済み更新データがいっぱいになった場合に発生します。チェックポイントが発生すると,RDBMSはメモリー・バッファ内にある(複数のトランザクションによる)更新データをまとめてディスクに書き込みます(図2)。

図2●チェックポイント
図2●チェックポイント

 アプリケーションから見ると,データの追加処理や変更処理を実行してトランザクションをCOMMITしても,その更新データはRDBMSのメモリー・バッファ内にしか存在しない状態がしばらく続くというわけです。


藤塚 勤也(ふじづか きんや)
NTTデータ 基盤システム事業本部
オープンソース開発センタ 技術開発担当
シニアスペシャリスト
 沖電気工業,タンデムコンピューターズ(現日本HP)を経て,2003年より株式会社 NTTデータに勤務。現在は,オープンソース・ソフトウエアを活用したエンタープライズ・システム向けの技術開発・技術支援に従事しており,特にシステムの中核であるRDBMSに注力している。「RDBMS解剖学」(翔泳社)を共著