概要
RDBMSのAtomicityとDurabilityを保障するための、ディスクにフラッシュするためのアプローチ。
stealとno-steal
steal
コミットされていないデータでもディスクにフラッシュする。フラッシュしたデータは他のトランザクションがロードできる。
stealを採用する場合、ディスクにフラッシュする前にUNDOログが必須。
ロールバックまたはクラッシュした場合はUNDOログからの復元が必要になる。
no-steal
コミットされていないデータをディスクにフラッシュすることを許容しない。
forceとno-force
force
トランザクションがコミットする時に変更したページがディスクにフラッシュが完了していることを強制する。
no-force
コミット時に変更したページがフラッシュされていなくてもよい。
その代わりコミット時にREDOログを出力を必須とする。
ディスクにフラッシュ前にデータベースがクラッシュした場合、ディスクのデータにREDOログの内容を適用することで復元する。
Write-Ahead Logging (WAL)
トランザクションリカバリ、クラッシュに対応するための補助的な仕組み。
ページの変更をキャッシュにバッファリングしつつACIDを保障するために必要。
(WALがないと常にディスクの読み書きが必要になる)
Atomicityを保証するため、ディスクからページをロードした時は必ずUNDOログを確認する。
ロードしたデータに対応するUNDOログがある場合は、それは他のトランザクションがコミット前のダーティなデータである。
UNDOログを適用することでコミット済みのデータを取得できる。
Durabilityを保証するため、コミット時に全てのREDOログを出力する。
ロードしたデータに対応するREDOログがある場合、コミットがディスクにフラッシュされていないデータをロードしたことになる。
REDOログを適用することでコミットしたデータになる。
組み合わせ
steal/no-force+WALの組み合わせが一般的。
仕組みは複雑(REDO、UNDOが必要)になるが、もっともパフォーマンスが出る。
ARIESというアルゴリズムが今日のトランザクション処理のベースとなっている。
no-steal/forceの組み合わせはパフォーマンスが低いがREDO、UNDOが不要になる。
(たぶん、理論上・・・)
参考
詳細データベースの本以外に以下のスライドが参考になった。