確定したトランザクションの結果が障害が起きても失われない性質。
永続性(Durability)とは、確定(コミット)したトランザクションの結果が、その後に障害が起きても失われない性質です。コミット=「この処理を確定します」とデータベースに伝える操作のことです。
ここで大切なのは、「確定しました」と応答を返したら、もう絶対に取り消されない・消えないという約束です。停電やプログラムの異常終了が起きても、確定済みの結果は守られます。
身近な例で考えると、ATMで「振込が完了しました」と画面に出た瞬間のようなものです。その直後にATMの電源が落ちても、振込はなかったことにはなりません。上の図解で、コミット後に停電してもデータが復元される流れを確認できます。
永続性は、障害復旧(リカバリ)の仕組みによって実現されます。データベースは、変更をすぐにはディスク本体へ書かず、まず高速なメモリ上で処理することがあります。メモリは電源が切れると消える「揮発性」の記憶なので、それだけでは永続性を守れません。
そこで障害復旧では、コミット済みの更新を確実に取り戻すために次のような操作を行います。
・ロールフォワード(前進復旧):コミット済みなのにディスクへ反映されていなかった更新を、ログを使って再適用する
・ロールバック(後退復旧):コミット前に中断した未確定の更新を、ログを使って取り消す
この2つを組み合わせることで、復旧後のデータベースは「コミット済みの更新だけが反映され、未確定の更新は残らない」正しい状態になります。永続性は、こうした復旧の仕組みに支えられているのです。
永続性を支える主役がログファイル(更新履歴を記録するファイル)です。DBMSは、トランザクションが行った更新の内容を、メモリではなく電源が切れても消えないディスク上のログファイルに書き出してから「確定しました」と応答します。
こうしておけば、たとえメモリ上の最新データが障害で消えても、ログをたどって同じ更新をやり直す(再適用する)ことで、コミット済みの結果を必ず復元できます。
身近な例で考えると、家計簿(記録)のようなものです。財布の中身(メモリ)を落としても、家計簿に「いつ・いくら・どう変えたか」を書いておけば、いつでも正しい残高を計算し直せます。ログファイルは、データベースにとっての家計簿なのです。