データベーススペシャリスト 2009年 午前2 問11
問題文
更新前情報と更新後情報をログとして利用するDBMSにおいて、ログを先に書き出すWAL(WriteAheadLog)プロトコルに従うとして、処理①~⑥を正しい順番に並べたものはどれか。
①begin transactionレコードの書出し
②データベースの実更新
③ログに更新前レコードの書出し
④ログに更新後レコードの出し
⑤commitレコードの書出し
⑥end transactionレコードの書出し
選択肢
ア:①→②→③→④→⑤→⑥
イ:①→③→②→④→⑥→⑤
ウ:①→③→②→⑤→④→⑥
エ:①→③→④→②→⑤→⑥(正解)
🔒 解説は解答すると表示されます
WALのログ書込み順序【午前2解説】
正解の理由
WAL(Write-Ahead Log)は「データベース本体に対する変更より先に、変更内容をログに書き出す」ことを要求します。したがって、トランザクション開始の記録(①)の後、データ更新に必要なログ(更新前レコード③、更新後レコード④)の両方を安定記憶に書いたうえで、実際のデータベース更新(②)を行います。さらに、コミットの耐久性を保証するためにコミットレコード(⑤)をログに書き、最終的な終了記録(⑥)でトランザクションを完了します。よって正しい並びは ①→③→④→②→⑤→⑥、すなわち選択肢 エ が正解です。
解法ステップ
- WALの原則を確認する:「ログはデータ本体の書き込みより先に書く」ことを基本にする。
- 各処理の意味を整理する:
- ① begin:開始ログ(最初)
- ③ 更新前レコード(undo用の前画像)
- ④ 更新後レコード(redo用の後画像)
- ② 実際のデータ更新(ページ書き込み等)
- ⑤ commit:コミットが確定したことを示すログ(永続化必須)
- ⑥ end:トランザクション終了の記録(最終の後片付け)
- WAL原則に照らして順序を並べる:①→③→④ を先に書き、②でデータ更新、⑤でコミット記録、⑥で終了。
選択肢別の誤答解説
-
ア: ①→②→③→④→⑤→⑥
- 誤り点:データ更新(②)がログ書き込み(③/④)より先に来ており、WALの「ログ先行」原則に反します。更新後にログが書かれるとクラッシュ時に復旧できない、または一貫性を損ないます。
-
イ: ①→③→②→④→⑥→⑤
- 誤り点1:④(更新後レコード)がデータ更新(②)の後に書かれており、これもWAL違反です。更新後にredo情報を書くのではなく、redo(更新後イメージ)はデータ更新前に安定化している必要があります。
- 誤り点2:⑥(end transaction)が⑤(commit)より先に来ています。これだとトランザクションの終了記録がコミット記録より先に記録され、トランザクション終結の順序が不適切です。通常はコミットが確定されてから終了処理(end)を行います。
-
ウ: ①→③→②→⑤→④→⑥
- 誤り点:④(更新後レコード)がコミット(⑤)の後に書かれています。更新後レコードがコミット後にしか存在しないと、クラッシュ後のredoができないため整合性が保てません。redo情報はデータ更新前か少なくともコミット前に永続化される必要があります。
-
エ: ①→③→④→②→⑤→⑥
- 正常:開始→(undo用の前画像・redo用の後画像)を先にログへ→データ更新→コミットログの永続化→終了、というWALとトランザクション整合性の要件を満たします。
よくある誤解
- 「更新前イメージ(③)は不要ではないか」
- 誤解です。更新前イメージはトランザクションが中断・ロールバックした際に元に戻すために必要です(undo)。更新前イメージを書かずにデータを上書きするとロールバック不能になります。
- 「end(⑥)はコミット(⑤)と同じ意味だろう」
- 異なります。commitは「トランザクションの確定(耐久性)」を示すログで、endはトランザクション終了処理(ログ上の終了マーカーや後片付け)を示します。commitが先に来る必要があります。
- 「どちらのログ(前・後)が先でも良い」
- 実装によっては順序は厳密でない部分もありますが、安全策としては両方をデータ更新前に確実に安定化(書き出し)することが求められます。
補足コラム
- WALは主に「redo」を安全に行うための仕組みです。データページが遅延してディスクに書き込まれても、ログにredo情報が残っていればクラッシュ後に更新を再適用できます。undo用の前画像を保存することで、途中で中断したトランザクションを元に戻す(ロールバックする)ことも可能になります。
- 実装詳細(例えばログバッファのフラッシュタイミングやチェックポイント)で性能や耐久性の微妙な違いが出ますが、試験問題では「ログがデータより先に書かれる」点と「commitは確実にログに残す」点を押さえておけば十分です。
FAQ
Q: 更新後レコード(④)がなぜデータ更新前に必要ですか?
A: 更新後レコードはredo情報です。データページがクラッシュ前にディスクに書き戻されていない場合でも、ログのredo情報を使って更新を再適用できるように、データ変更前に確実にログに残しておく必要があります。
A: 更新後レコードはredo情報です。データページがクラッシュ前にディスクに書き戻されていない場合でも、ログのredo情報を使って更新を再適用できるように、データ変更前に確実にログに残しておく必要があります。
Q: commit(⑤)とend(⑥)のどちらか一方が欠けても良いですか?
A: いいえ。commitはトランザクションの確定を保証するために必須です。endは運用上の後片付けやログの整理を示す記録で、コミット後に書かれるのが正しい順序です。
A: いいえ。commitはトランザクションの確定を保証するために必須です。endは運用上の後片付けやログの整理を示す記録で、コミット後に書かれるのが正しい順序です。
関連キーワード: WAL, ログ先行書込み, redo, undo, トランザクションログ, コミット順序, チェックポイント, データベース復旧

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

