ホーム > データベーススペシャリスト試験 > 2012年
データベーススペシャリスト試験 2012年 午前2 問17
更新前レコードと更新後レコードをログとして利用する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プロトコルでは、まずトランザクション開始を示す①begin transactionレコードを書き出し、次に更新前の状態③、更新後の状態④のログを順に書き込みます。これにより障害発生時に元の状態へ戻せる情報が確保されます。
その後、実際のデータベースを更新②し、トランザクションの確定を示す⑤commitレコードを書き込みます。最後に⑥end transactionレコードでトランザクション終了を記録します。
この順序を守ることで、障害発生時にログから正確にリカバリが可能となります。
よくある誤解
ログの書き出しはデータベース更新後でよいと誤解されがちですが、WALでは必ず先にログを書き出します。
commitレコードは更新後すぐに書くのではなく、データ更新後に書く必要があります。
commitレコードは更新後すぐに書くのではなく、データ更新後に書く必要があります。
解法ステップ
- トランザクション開始を示すbegin transactionレコードを書き出す(①)。
- 更新前のレコードをログに書き出す(③)。
- 更新後のレコードをログに書き出す(④)。
- 実際のデータベースを更新する(②)。
- トランザクションの確定を示すcommitレコードを書き出す(⑤)。
- トランザクション終了を示すend transactionレコードを書き出す(⑥)。
選択肢別の誤答解説
- ア: ①→②→③→④→⑤→⑥
→ データベース更新②がログ書き出し③④より先に来ており、WALの原則に反します。 - イ: ①→③→②→④→⑥→⑤
→ 更新後レコード④がcommit⑤より後に書かれており、順序が不適切です。 - ウ: ①→③→②→⑤→④→⑥
→ commit⑤が更新後レコード④より先に書かれており、ログの整合性が保てません。 - エ: ①→③→④→②→⑤→⑥
→ WALプロトコルの正しい順序であり、ログの整合性とリカバリ性を確保しています。
補足コラム
WAL(Write Ahead Log)はデータベースの障害復旧に不可欠な技術です。
更新前レコード(undo情報)と更新後レコード(redo情報)をログに残すことで、障害発生時にトランザクションの途中状態を正確に復元できます。
また、commitレコードはトランザクションの確定を示し、これが書き込まれるまでは更新内容は確定しません。
更新前レコード(undo情報)と更新後レコード(redo情報)をログに残すことで、障害発生時にトランザクションの途中状態を正確に復元できます。
また、commitレコードはトランザクションの確定を示し、これが書き込まれるまでは更新内容は確定しません。
FAQ
Q: なぜ更新前レコードと更新後レコードの両方をログに書くのですか?
A: 更新前レコードはロールバック時に元に戻すため、更新後レコードはクラッシュ後のリカバリで変更を再適用するために必要です。
A: 更新前レコードはロールバック時に元に戻すため、更新後レコードはクラッシュ後のリカバリで変更を再適用するために必要です。
Q: commitレコードはなぜ更新後のログ書き込みより後に書くのですか?
A: commitレコードはトランザクションの確定を示すため、更新内容がすべてログに記録された後でなければなりません。
A: commitレコードはトランザクションの確定を示すため、更新内容がすべてログに記録された後でなければなりません。
関連キーワード: WAL, トランザクション管理, ログ管理, データベース障害復旧, 更新前イメージ, 更新後イメージ