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


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

解説

更新前レコードと更新後レコードをログとして利用するDBMSのWALプロトコル【午前2 解説】

要点まとめ

  • 結論:WALプロトコルではログに更新前・更新後のレコードを先に書き出し、その後にデータベース本体を更新します。
  • 根拠:WALは障害時のリカバリを確実にするため、変更内容をログに記録してから実データを更新する仕組みです。
  • 差がつくポイント:更新前・更新後のログの順序と、commit/end transactionレコードの正しい書き出し順序を理解することが重要です。

正解の理由

正解はエの「①→③→④→②→⑤→⑥」です。
WALプロトコルでは、まずトランザクション開始を示す①begin transactionレコードを書き出し、次に更新前の状態③、更新後の状態④のログを順に書き込みます。これにより障害発生時に元の状態へ戻せる情報が確保されます。
その後、実際のデータベースを更新②し、トランザクションの確定を示す⑤commitレコードを書き込みます。最後に⑥end transactionレコードでトランザクション終了を記録します。
この順序を守ることで、障害発生時にログから正確にリカバリが可能となります。

よくある誤解

ログの書き出しはデータベース更新後でよいと誤解されがちですが、WALでは必ず先にログを書き出します。
commitレコードは更新後すぐに書くのではなく、データ更新後に書く必要があります。

解法ステップ

  1. トランザクション開始を示すbegin transactionレコードを書き出す(①)。
  2. 更新前のレコードをログに書き出す(③)。
  3. 更新後のレコードをログに書き出す(④)。
  4. 実際のデータベースを更新する(②)。
  5. トランザクションの確定を示すcommitレコードを書き出す(⑤)。
  6. トランザクション終了を示すend transactionレコードを書き出す(⑥)。

選択肢別の誤答解説

  • ア: ①→②→③→④→⑤→⑥
    → データベース更新②がログ書き出し③④より先に来ており、WALの原則に反します。
  • イ: ①→③→②→④→⑥→⑤
    → 更新後レコード④がcommit⑤より後に書かれており、順序が不適切です。
  • ウ: ①→③→②→⑤→④→⑥
    → commit⑤が更新後レコード④より先に書かれており、ログの整合性が保てません。
  • エ: ①→③→④→②→⑤→⑥
    → WALプロトコルの正しい順序であり、ログの整合性とリカバリ性を確保しています。

補足コラム

WAL(Write Ahead Log)はデータベースの障害復旧に不可欠な技術です。
更新前レコード(undo情報)と更新後レコード(redo情報)をログに残すことで、障害発生時にトランザクションの途中状態を正確に復元できます。
また、commitレコードはトランザクションの確定を示し、これが書き込まれるまでは更新内容は確定しません。

FAQ

Q: なぜ更新前レコードと更新後レコードの両方をログに書くのですか?
A: 更新前レコードはロールバック時に元に戻すため、更新後レコードはクラッシュ後のリカバリで変更を再適用するために必要です。
Q: commitレコードはなぜ更新後のログ書き込みより後に書くのですか?
A: commitレコードはトランザクションの確定を示すため、更新内容がすべてログに記録された後でなければなりません。

関連キーワード: WAL, トランザクション管理, ログ管理, データベース障害復旧, 更新前イメージ, 更新後イメージ
← 前の問題へ次の問題へ →

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