更新SQL文やトランザクションを処理するとき,RDBMSの内部ではどのようなことが行われているのでしょうか?

 こうした内部動作を知ることは,データベース・アプリケーションで何か問題が起きたときのトラブル・シューティングに役立ちます。ぜひ,更新処理やトランザクション処理を行っているときの,RDBMSの動作の仕組みを押さえてほしいと思います。そのためにはRDBMSの基本的な構造を知らなければなりませんが,この連載で登場するのは「メモリー・バッファ」「データベース・ファイル」「トランザクションログ・ファイル」の三つです(図1)。

図1●RDBMSの構造
図1●RDBMSの構造

 RDBMSがデータを読み書きする場合,必ず「メモリー・バッファ」上のデータに対して処理します。更新処理を行う場合は,まずメモリー・バッファ上のデータを更新し,その後ディスクに書き込みます。メモリー・バッファに存在するデータの種類はRDBMSによって様々ですが,少なくともユーザー・データベースのデータとトランザクションログ・データの2種類のデータが存在します。

 「データベース・ファイル」は,ユーザー・データベースのデータをディスク内に格納するものです。アプリケーションから実行した更新SQL文の処理結果は,最終的にこのファイル内に格納されます。

 「トランザクションログ・ファイル」は,トランザクション機能を実現する上で無くてはならないファイルです。このファイル内にトランザクションの結果を格納することにより,様々な障害から確定済みのトランザクションを保障することが可能になります。

 「メモリー・バッファ」「データベース・ファイル」「トランザクションログ・ファイル」の三つが今回登場するRDBMSの内部構造です。皆さんが普段使用しているRDBMSでは,三つのそれぞれがどの部分にあてはまるのかをイメージして見て下さい。

 ではここから,RDBMSの動作の仕組みを説明します。例として,『2007年11月20日に顧客番号「1001」の日経太郎さんに商品番号「3000」の商品を500円で販売した』というトランザクションを取り上げます。更新SQL文は,前回も登場した以下のSQL文です。

[SQL文1] 顧客テーブルを更新
UPDATE 顧客テーブル SET 販売総額 = 販売総額+500 WHERE 顧客番号 = 1001;
[SQL文2] 販売実績テーブルにレコードを1件挿入
INSERT INTO 販売実績テーブル VALUES (‘20071120’,3000,1001,500);

 RDBMSはSQL文1を受け取ると,SELECT文を受け取った時と同じように構文解析を行います。そして,UPDATE文であることを理解します。続いて,UPDATE対象のレコードを探します。このレコードを探す方法は,SELECT文と同じです。まず,「メモリー・バッファ」内に対象のレコードが存在していないかを確認し,存在していない場合は,ディスク上の「データベース・ファイル」から読み込みます。そして,メモリー・バッファ内に読み込んだ対象のレコードの値を指定された値に更新します(図2)。

図2●レコード更新
図2●レコード更新

 ただし,この更新処理は確定していません。なぜならば,トランザクション処理の中で実行される更新処理は,トランザクションの終了時点でROLLBACKされることがあり,その場合処理をキャンセルしなければならないからです。よって,必ず更新前の値を保存し,処理をキャンセルできるようにしておきます。この更新前の値の保存方法はRDBMS製品によって違いがありますが,アプリケーションを開発する上で特別何かに注意する必要はありません。

 また,更新SQL文の処理が終了しても,メモリー・バッファ上の値は更新されていますが,ディスク上のデータベース・ファイルにはまだ書き込んでいないということを押さえておかなければなりません。更新SQL文を実行すると,そのタイミングでデータベース・ファイルを書き換えているように思うかもしれませんが,そうではありません。

 さらに言えば,トランザクションをCOMMITで終了したとしても,ディスク上のデータが更新されているとは限りません。しかし,一度COMMITしたトランザクションは,たとえサーバーなどに不具合が発生したとしても,リカバリなどの作業を通して確実にデータベースに反映されなければなりません。そのために,トランザクション内での更新情報をディスク上のファイルに書き込みます。それが,「トランザクションログ・ファイル」です。ファイルとしてトランザクション情報を保持しておけば,その情報を基にデータベースをトランザクション後の状態にすることができます。


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