対象試験と出題頻度

ロールバック(後退復帰)は、基本情報技術者・応用情報技術者で出題されるテーマです。

DBMSの障害回復機能に関する問題として定番化しており、「ロールフォワード」「チェックポイント」「コミット」との違いを正確に区別できるかが問われます。

詳細をクリックして確認
対象試験:
基本情報技術者
応用情報技術者
出題頻度:
★★★★☆
ランクA(重要)必ず覚えておくべき

用語の定義

情報処理試験を勉強していると、「ロールバックって結局何をする処理?ロールフォワードとどっちがどっち?」と混乱しがちです。

ロールバック(Rollback/後退復帰)とは、一言で言うと

 「トランザクションが異常終了したとき、更新前ログを使ってデータベースをトランザクション開始直前の状態に戻す処理

のことです。

イメージとしては、書きかけの書類をシュレッダーにかけて白紙からやり直す操作です。

途中まで書いた内容に誤りが見つかったとき、修正テープで直すのではなく、書類そのものを破棄して作業前の状態に戻す。

ロールバックはまさにこの「なかったことにする」処理に当たります。

ロールバックの基本情報

項目 内容
英語名 Rollback
別名 後退復帰、バックワードリカバリ
使用するログ 更新前ログ(更新前ジャーナル)
復帰先 トランザクション開始直前の状態
発動条件 トランザクションの異常終了(コミット前の障害)

解説

データベースでは、一連の処理をひとまとめにした「トランザクション」という単位でデータを更新します。銀行振込で言えば「送金元の残高を減らす」と「送金先の残高を増やす」がセットで1つのトランザクションです。

この処理が途中で止まると、片方だけ残高が変わった中途半端な状態になり、データの整合性が崩れます。

これを防ぐために、トランザクションには「すべて完了するか、まったく実行されなかったかのどちらかで終わる」という原子性(Atomicity)が求められます。ロールバックは、この原子性を保証するための仕組みです。

ロールバックの動作フロー

「口座Aから口座Bへ1万円を振り込む」トランザクションを例に、正常時と異常時の動きを比較します。

更新対象は2つ、「① A残高を減らす」「② B残高を増やす」です。

時間 ▶
開始 ① A残高 −1万 ② B残高 +1万 結末
正常時
BEGIN
① 成功
② 成功
COMMIT ✓
①②とも成功 → 両方の更新がデータベースに反映
▲ ②で障害発生
異常時
BEGIN
① 成功
② 失敗 ✕
ROLLBACK
②が失敗 → 成功した①も含めて全部取り消し(BEGIN直前に戻す)

「①は成功したのだから①だけ残せばいいのでは?」と思うかもしれませんが、それをやるとA残高だけ減ってB残高は増えない状態になります。これが「原子性の破壊」です。ロールバックは成功した更新も含めてすべて巻き戻すことで、データの整合性を守ります。

ポイントは、ログに「変更後の値」ではなく「変更前の値」を使う点です。

変更前の値で上書きするからこそ、「なかったこと」にできます。

ロールフォワード(前進復帰)との比較

障害回復にはもう一つ「ロールフォワード」があります。

この2つは対になる概念なので、セットで押さえるのが鉄則です。

比較項目 ロールバック(後退復帰) ロールフォワード(前進復帰)
使うログ 更新前ログ 更新後ログ
戻り先 トランザクション開始直前 障害発生直前(最新の状態)
発動場面 コミット前にトランザクションが異常終了 媒体障害等でDBが破損し、バックアップから復旧する際にコミット済みの処理を再現
方向 過去へ戻す(後退) 未来へ進める(前進)

ロールバックとロールフォワードの守備範囲

過去 現在
バックアップ
取得
チェック
ポイント
トランザクション
開始〜更新中
障害
発生
▶ ロールフォワード(前進復帰)
バックアップ → 更新後ログで障害直前まで進める
◀ ロールバック(後退復帰)
更新前ログでトランザクション開始前に戻す

では、この用語が試験でどのように出題されるか見ていきましょう。

ロールバックの核心を3行で

・更新前ログを使って、トランザクション開始直前の状態に戻す処理
・コミット前に異常終了した場合に発動し、原子性を保証する
・ロールフォワードとは「使うログ」と「戻り先」が逆


試験ではこう出る!

ロールバックは、FE・APの午前問題で障害回復の知識を問う問題として繰り返し出題されています。

出題パターンは大きく2つに分かれます。

過去問での出題実績

試験回 出題内容 問われたポイント
FE H29秋
午前 問30
ロールバック処理でデータベースを復元する際に使用する情報を選ぶ問題。 ・正解は「ログファイルの更新前情報」
・スナップショット、バックアップ、更新後情報がひっかけ
FE H22秋
午前 問56
ロールバック処理の説明として正しいものを選ぶ問題。 ・「更新前ジャーナル」+「開始直前」の組み合わせが正解
・更新後ジャーナル、障害直前の状態がひっかけ
AP H19秋
午前 問68
トランザクション異常終了時にDBMSが行うべき処理を選ぶ問題。 ・正解は「後退復帰(ロールバック)」
・前進復帰、チェックポイント取得、バックアップ取得がひっかけ
IP H30秋
問63
トランザクション処理におけるロールバックの説明を選ぶ問題。 ・正解は「正常に処理されなかったときにDB開始前の状態にする」
・排他制御、コミット、結合演算の説明がひっかけ

IPA試験での出題パターン

パターン1:「ロールバック処理に使う情報を選べ」
FE H29秋 問30が代表例です。「更新前ログ」が正解で、「更新後ログ」はロールフォワード用。この「前/後」の取り違えが最大のひっかけポイントです。ここだけは確実に押さえてください。

 

パターン2:「ロールバックの説明を選べ」
FE H22秋 問56やIP H30秋 問63のように、4つの説明文が並び、ロールバックに該当するものを選ぶ形式です。「更新前ジャーナル」×「トランザクション開始直前の状態に戻す」の2条件が揃った選択肢を選べば正解です。「障害直前の状態にまで復旧」はロールフォワードの説明なので除外します。

 

試験ではここまででOKです。SQLの ROLLBACK 文の構文やオプションまで問われることはほぼないので、深追いは不要です。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。


Q. データベースのロールバック処理の説明として、最も適切なものはどれでしょうか?

  • A. バックアップファイルと更新後ログを使って、障害発生直前の状態までデータベースを復旧する処理。
  • B. 更新前ログ(更新前ジャーナル)を使って、トランザクション開始直前の状態にデータベースを戻す処理。
  • C. 複数のトランザクションが同一データに同時アクセスする際に、データの矛盾を防ぐ処理。

正解と解説を見る

正解:B

解説:
ロールバック(後退復帰)は、トランザクションが異常終了した際に、更新前ログを用いてデータベースをトランザクション開始直前の状態に復元する処理です。

選択肢Aはロールフォワード(前進復帰)の説明です。ロールフォワードはバックアップから復元した後に更新後ログを適用して障害発生直前の状態まで進める処理であり、使うログの種類と復帰先の方向が異なります。選択肢Cは排他制御の説明です。排他制御はデータの同時アクセスによる矛盾を防ぐ仕組みであり、障害回復とは目的が異なります。


よくある質問(FAQ)

Q. SQLで明示的にロールバックすることはできますか?

できます。SQLには ROLLBACK 文が用意されており、アプリケーション側から意図的にトランザクションを取り消すことが可能です。例えば、処理の途中でバリデーションエラーを検知した場合に ROLLBACK を発行して変更を破棄するのは実務でも一般的な使い方です。IPA試験では ROLLBACK 文の構文そのものを問われることはほとんどなく、障害回復の仕組みとして理解していれば十分です。

Q. チェックポイントとロールバックはどう関係しますか?

チェックポイントは、DBMSがメモリ上の更新内容をディスクに書き出し、ログの区切りを記録するタイミングです。システム障害が起きた場合、DBMSはチェックポイントの状態をまず復元し、その後「コミット済みのトランザクション」にはロールフォワードを、「未コミットのトランザクション」にはロールバックを適用します。AP R4秋 午前問29では、このチェックポイントを起点とした振り分け判断がそのまま出題されています。

Q. ロールバックが発生するとパフォーマンスに影響はありますか?

影響はあります。ロールバックが実行されると、更新前ログを読み込んで変更をすべて取り消すため、トランザクション中の更新量が多いほど復元にかかる時間も長くなります。また、ロールバック中はロック(排他制御のロック)が保持されるため、他のトランザクションの待ちが発生する場合があります。実務では長大なトランザクションを避け、適切な粒度でコミットするのが基本的な対策です。

Q. デッドロックが発生したときもロールバックが使われますか?

使われます。デッドロックが検知されると、DBMSはいずれか一方のトランザクションを犠牲者(victim)として選び、そのトランザクションをロールバックしてロックを解放します。これによりもう一方のトランザクションが処理を続行できるようになります。