③ WALとトランザクションの間

書き込み中に電源が落ちたら?

データベースへの書き込みは複数バイトにまたがります。その途中で電源が落ちたら ファイルは壊れないのでしょうか? SQLiteはこの問題を「WAL(Write-Ahead Log)」で 解決しています。変更をまず別ファイル(trader.db-wal)に追記し、 本体ファイルはあとでまとめて安全に反映(チェックポイント)します。

読み込み中…

trader.dbの心電図

WALサイズ: 取得中…

新規フレームの中身

trader.dbへの書き込みが起きるたびに、どのページに何が書かれたかをその場でデコードします。

ACIDとチェックポイント

Atomicity(原子性)・Consistency(一貫性)・ Isolation(独立性)・Durability(永続性)。 WALモードではコミット済みの変更はtrader.db-walへの追記だけで完了し、 本体ファイルへの反映(チェックポイント)は後回しにできます。読み取り側は 本体ファイル+WALの両方を見て最新状態を再構成するため、書き込み中でも 読み取りをブロックしません。

対してbbs.dbは昔ながらのロールバックジャーナル方式です。 書き込み前に変更前のページをbbs.db-journalに退避し、コミット後に ジャーナルを消します。こちらは書き込み中、読み取りが待たされることがあります。 実機で使われている2方式を実際に見比べられるのはこの展示の見どころです。