戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

データベーススペシャリスト 2012年 午前217


問題文

更新前レコードと更新後レコードをログとして利用するDBMSにおいて、ログを先に書き出すWAL(Write Ahead Log)プロトコルに従うとして、処理①~⑥を正しい順番に並べたものはどれか。
①begin transactionレコードを書き出す。 ②データベースを更新する。 ③ログに更新前レコードを書き出す。 ④ログに更新後レコードを書き出す。 ⑤commitレコードを書き出す。 ⑥end transactionレコードを書き出す。

選択肢

①→②→③→④→⑤→⑥
①→③→②→④→⑥→⑤
①→③→②→⑤→④→⑥
①→③→④→②→⑤→⑥(正解)

🔒 解説は解答すると表示されます

先行ログ方式(WAL)【午前2解説】

正解の理由

WAL(Write Ahead Log、先行ログ方式)は「データベース本体に反映するより前に、回復に必要なログ(更新前後イメージやコミット記録)を永続化する」ことを要求します。したがってトランザクション開始の記録→(各更新について)更新前イメージ→更新後イメージをログに書き出し、それらが安定化された後にデータベース本体を更新し、最後にコミットと終了の記録を出す順序が正しいです。この要件を満たす選択肢は (①→③→④→②→⑤→⑥)です。コミット(⑤)は必ずend(⑥)より前に書かれ、また更新後イメージ(④)はデータベース更新(②)より前にログに残されていなければ、障害発生時に正しくredo/undoできません。

解法ステップ

  1. WALの基本要件を確認する:「ログはデータ更新より先に永続化されること(Write Ahead)」「コミットはログに残して永続化された時点で確定する」。
  2. 設問の各処理の役割を認識する:
    • ① begin:トランザクション開始の記録
    • ③ 更新前レコード:undoに必要
    • ④ 更新後レコード:redoに必要
    • ② データベース更新:ページやレコードの実体変更
    • ⑤ commit:確定記録(必ず永続化)
    • ⑥ end:トランザクション終了の後処理完了記録
  3. 要件に照らして順序を並べる:① → ③ → ④ → ② → ⑤ → ⑥。
  4. 選択肢と照合して を選ぶ。

選択肢別の誤答解説

  • ア: ①→②→③→④→⑤→⑥
    誤り点:データベース更新(②)が先に来ており、更新前後のログ(③・④)が後になっています。WALに反し、障害時に必要なログが未永続化のままデータを書き込むことになり、回復不能になる可能性があります。
  • イ: ①→③→②→④→⑥→⑤
    誤り点1:更新後レコード(④)がデータベース更新(②)の後に書かれており、WALの「ログはデータ更新より先に」要件を満たしていません。
    誤り点2(重要):end(⑥)がcommit(⑤)より先に書かれている点が致命的です。commit はトランザクション確定を示す記録であり、end はその後のクリーンアップ記録です。commitがendより後に来る(つまりcommitがendの後で初めて書かれる)順序は論理的に不適切で、復旧処理が成立しません。
  • ウ: ①→③→②→⑤→④→⑥
    誤り点:commit(⑤)が更新後レコード(④)より前に書かれています。commit が永続化された後に、redoに必要な更新後イメージが未永続化という状態は許されません。コミット済みの変更を障害後に再適用(redo)できなくなる恐れがあります。
  • エ: ①→③→④→②→⑤→⑥
    理由:更新前イメージ→更新後イメージをログに残してからデータ本体を更新し、コミットをログに永続化して最後に終了記録を出す流れは、WALの要件(undo/redoに必要なログを先に確保し、コミットを永続化してから終了)を満たします。したがって正しい順序です。

よくある誤解

  • 「ログはまとめてでもよい」
    誤解:ログとデータ更新の順序さえ守ればよいと考え、更新後イメージをデータ更新後にまとめて書き込めばよいと思いがちです。実際はコミット前にredo用の情報が確実に永続化されている必要があります。
  • 「endが先でも問題ない」
    誤解:endは単なる終了マークと考える誤り。endはトランザクションの後処理が完了したことを示す記録であり、commitが記録・永続化されていることが前提です。順序を逆にすると回復不整合が生じます。

補足コラム

  • ARIESのような現代的なログ再実行方式では、各更新ログにundoとredo情報(before/afterイメージや差分)を含め、ログの先行性(WAL)とチェックポイントを組み合わせて効率的な復旧を実現しています。
  • 実装面では「ログの永続化=ディスクへ書くだけでなくfsync等で確実にディスクに反映させる」操作が必要です。単にバッファに入れただけではWAL要件は満たされません。
  • group commit:高負荷環境では複数トランザクションのcommitログを書きまとめて永続化する手法が用いられますが、各トランザクションごとにcommitログが確実に永続化されることが前提です。

FAQ

Q1: beforeイメージ(③)は必須ですか?
A1: undo(ロールバック)を可能にするために通常必要です。システム設計によっては代替手段もありますが、一般的なWALでは更新前情報を保持します。
Q2: なぜ更新後イメージ(④)も先に書く必要があるのですか?
A2: 障害発生後にコミット済み変更を再適用(redo)するために、更新後の状態をログに持っておく必要があります。これがないと、データファイルが古い状態のままになり整合性を保てません。
Q3: commitとendの違いは?
A3: commit(⑤)はトランザクションの確定(変更は永続化されるべき)を示すログ、end(⑥)はそのトランザクションに関する後処理(リソース解放やログ領域の再利用可能化)が完了したことを示すログです。commitが先、endが後です。

関連キーワード: WAL、先行ログ方式、ログ再実行、redo、undo、コミット順序、ARIES、fsync、トランザクションログ
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリスト
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について