情報処理安全確保支援士試験 令和7年秋期午前Ⅱ DBMS

出典:令和7年秋期 午前Ⅱ 問21 分野:データベース / トランザクション処理
DBMSがトランザクションのコミット処理を完了するタイミングはどれか。
  • ア:アプリケーションプログラムによるデータ更新命令完了時点
  • イ:チェックポイント処理完了時点
  • ウ:ログバッファへのコミット情報書込み完了時点
  • エ:ログファイルへのコミット情報書込み完了時点
解説

データベースの更新は、下記の流れで行われます。

  1. トランザクションを開始する
  2. 必要なデータをデータベースから主記憶、つまりメモリ上に読み込む
  3. メモリ上のデータを更新する
  4. COMMITによってトランザクションを確定する
  5. 一定のタイミングで、メモリ上の更新内容をまとめて補助記憶、つまりディスクなどに書き込む

ここで大事なのは、COMMITの直後に必ずデータ本体がディスクへ書き込まれるわけではない点です。なぜすぐにディスクへ書き込まないかというと、効率が悪いからです。

データを更新するたびに毎回ディスクへ書き込むと、処理速度が遅くなります。そのため、データベースでは更新内容をいったんメモリ上に保持し、チェックポイントなどのタイミングでまとめてディスクへ書き込みます。

つまり、COMMITは完了しているのに更新後のデータ本体はまだメモリ上にあり、ディスクへの書き込みはまだ行われていない状況が起こり得ます。

ここで問題になるのが、障害発生時です。メモリは揮発性の記憶装置なので、サーバが落ちたり電源障害が起きたりすると、メモリ上の内容は失われます。

そのため、もし次のタイミングで障害が起きると困ります。

  1. COMMITは実行された
  2. しかし、更新内容はまだディスクに書き込まれていない
  3. その間に障害が発生した

この場合、COMMIT済みのはずのデータが失われる可能性があります。これでは、トランザクションの性質である永続性、つまり一度確定した処理は失われないという性質を満たせません。

そこで使われるのが WALプロトコル です。WALは Write Ahead Logging の略で、簡単に言うと、「データ本体を書き込む前に、まずログを安全な場所に書き込む」という仕組みです。

流れとしては次のようになります。

  1. データを更新する
  2. 更新内容をログに記録する
  3. そのログをディスクなどの安定した記憶装置に書き込む
  4. ログの書き込みが完了した時点で、COMMIT済みと見なす
  5. 後でデータ本体をディスクへまとめて書き込む

なぜログが重要かというと、ログさえ残っていれば、障害が起きても更新内容を再現できるからです。

たとえば、COMMIT後にデータ本体がまだディスクに書かれていない状態で障害が起きたとしても、更新後ログが残っていれば、「このトランザクションはCOMMIT済みだった」「この内容でデータを更新すればよい」と判断できます。

そのため、データベースを復旧するときに、ログを使ってCOMMIT済みの処理をやり直せます。

したがって、が適切です。

❌他選択肢が誤りの理由
ア:アプリケーションプログラムによるデータ更新命令完了時点
⇒更新命令の完了、という点で違います。更新命令が完了しても、ログが永続化されていなければ障害時に復旧できません。
イ:チェックポイント処理完了時点
⇒チェックポイント完了、という点で違います。チェックポイントは回復時間短縮の仕組みであり、コミット完了の条件ではありません。
ウ:ログバッファへのコミット情報書込み完了時点
⇒ログバッファへの書込み完了、という点で違います。ログバッファは揮発性であり、障害時に失われる可能性があります。
TSUNAGARU-ADVICE

まず押さえたいこと

トランザクションのコミットで重要なのは、更新内容そのものが即座にデータファイルへ反映されたかではなく、障害が起きても復旧できる形でコミット情報が永続化されたかです。

迷ったときの判断軸

DBMSは、アプリケーションの更新命令が終わった時点や、ログバッファに書いただけの時点では、まだ安全とはいえません。コミット完了とみなせるのは、コミット情報が揮発しないログファイルに書き込まれた時点と整理すると判断しやすくなります。

科目Bにつなげるために

科目Bでは、トランザクション制御を用語で覚えるだけでなく、障害発生時にどこまで処理結果を保証できるかを理解していることが重要です。バッファ上の情報と、永続記憶に書き込まれた情報の違いを意識して整理しておきましょう。※DB関連試験向け