データベースの世界でもっとも重要な観念は,おそらくトランザクション[英語のtransactionは,取引,処理などを意味する。データベースにおけるtransactionは,日本語文献でもトランザクションとカタカナ表記するのが普通なので,ここでもトランザクションという言葉を使う。意味についてはすぐあとを参照のこと]。しかし,トランザクションとは何なのか,なぜ必要なのかを理解するためには,コンピュータについて2つの事実を受け入れなければならない。最初の事実は,たぶん誰もはいやというほど知っていることである。コンピュータプログラムはクラッシュする。そして,プログラムはクラッシュしたときに,自分がしていたことをすべて忘れてしまう。コンピュータのファイルシステムに明示的に保存された情報だけが残る。知らなければならない第2の事実は,だいぶわかりにくいが,きわめて重要なことである。コンピュータのハードディスクやフラッシュメモリーなどの記憶装置が瞬間的に書き込めるデータはごくわずかで,一般的には約500字ほどである(専門用語に関心のある読者に説明しておくと,ここで言っているのはハードディスクの「セクターサイズ」のことで,一般に512バイトである。フラッシュメモリーの場合,問題になるのは「ページサイズ」だが,やはり数百〜数千バイトである)。最近のドライブは500字の書き込みを1秒に数百,数千回実行できるので,普通のコンピュータユーザーは,デバイスに瞬間的に書き込めるデータのサイズがこのように小さく制限されていることには気づかない。しかし,ディスクの内容は,1度に数百字ずつしか書き換えられないのは事実である。
このこととデータベースにいったいどのような関係があるのだろうか。実は,きわめて重要な意味がある。一般に,コンピュータは,同時にデータベースの1行分しか更新できないのだ。先ほどの非常に小さくて単純なサンプルサイズでは,これを実証できない。上の例は,表全体で200字に足りないので,コンピュータは2行を同時に更新できるだろう。しかし,一般に合理的な規模のデータベースでは,2つの異なる行を書き換えるためには,2回の別々のディスク操作が必要である。
以上の事実をはっきりさせると,問題の核心に入っていくことができる。データベースに一見単純な変更を加えようとすると,複数の行を書き換えなければならない。そして,今わかったように,2つの異なる行の書き換えは,1回のディスク操作では実行できない。そのため,データベースの更新は,複数回のディスク操作を連続的に行った結果となる。しかし,コンピュータはいつでもクラッシュする可能性がある。コンピュータがこのような2回のディスク操作の「間に」クラッシュしたらどうなるだろうか。コンピュータをリブートすることはできるが,クラッシュしたときに実行することになっていた処理のことは忘れている。そのため,必要とされる変更が実行されない場合がある。つまり,データベースが一貫性のない状態に取り残される場合があるということだ。
ジョン・マコーミック 長尾高弘(訳) (2012). 世界でもっとも強力な9のアルゴリズム 日経BP社 pp.190-192
PR