ロールバックとロールフォワードはどの場面で使うか
情報セキュリティマネジメント試験 令和元年度秋期 午前 問46 / データベース › トランザクション処理
過去問にチャレンジ
データベースのトランザクションに関する記述のうち,適切なものはどれか。
- ア
他のトランザクションにデータを更新されないようにするために,テーブルに対するロックをアプリケーションプログラムが解放した。
- イ
トランザクション障害が発生したので,異常終了したトランザクションをDBMSがロールフォワードした。
- ウ
トランザクションの更新結果を確定するために,トランザクションをアプリケーションプログラムがロールバックした。
- エ
複数のトランザクション間でデッドロックが発生したので,トランザクションをDBMSがロールバックした。
会話形式の解説
講師今回の問題は、トランザクション処理の4つの操作(ロック、コミット、ロールバック、ロールフォワード)のうち、場面に合った使い方をしている記述を選ぶものです。それぞれの目的と使う場面を結び付けられるかがポイントです。
受験者名前が似ていて混乱します。特にロールバックとロールフォワードは、どちらも障害のときに使うものという印象しかありません。
講師まず4つの操作の意味を整理しましょう。コミットは更新を確定する操作です。ロールバックは更新を取り消して、トランザクション開始前の状態に戻す操作です。ロールフォワードは、ログに残った更新後の情報を再適用して、コミット済みの更新を復元する方法です。
受験者そうすると、更新結果を確定するためにロールバックした、という記述は逆になりますね。確定したいならコミットのはずです。
講師そのとおりです。ロールバックは取り消しの操作なので、確定とは逆の働きです。では、他のトランザクションに更新されないようにロックを解放した、という記述はどうでしょう。
受験者ロックは、ほかの処理に触らせないためにかけるものですよね。それを解放したら、むしろ更新されてしまう気がします。
講師はい。更新を防ぎたいなら、ロックは解放しないで保持しておく必要があります。解放するとほかのトランザクションが更新できるようになるので、目的と逆の結果になります。
受験者次の、トランザクション障害で異常終了したトランザクションをロールフォワードした、という記述で迷いました。復旧という意味では合っているように見えます。
講師ここが一番紛らわしいところです。異常終了したトランザクションは、途中までしか更新が進んでいません。その中途半端な更新を取り消すために使うのはロールバックです。ロールフォワードはコミット済みの更新をログから再適用する方法なので、この場面には合いません。
受験者未確定の更新なら取り消す、確定済みの更新ならやり直す、と考えればよいのですね。では、デッドロックの記述はどうなりますか。
講師デッドロックは、複数のトランザクションが互いに相手の資源の解放を待っていて、どちらも先へ進めなくなった状態です。DBMSはどれかのトランザクションをロールバックし、そのトランザクションが持っていた資源を解放させて、待ち合いを解消します。なので、この記述が適切です。
受験者整理すると、確定はコミット、取り消しはロールバック、確定済みのやり直しはロールフォワードです。デッドロックとトランザクション障害には、どちらもロールバックで対応するということですね。
講師よくまとまっています。補足すると、媒体障害のようにデータそのものが失われた場合は、一般にバックアップから戻したうえでロールフォワードを行い、コミット済みの更新を復元します。この問題の引っかけは、ロールバックとロールフォワードの入れ替えと、コミットとロールバックの取り違えでした。障害の種類ごとに、やり直すのか取り消すのかを考えると区別しやすくなります。
まとめ
この問題は、トランザクション処理で使う操作の目的と使う場面を問うものです。コミットは更新の確定、ロールバックは更新を取り消して開始前の状態に戻す操作、ロールフォワードはログの更新後の情報を再適用してコミット済みの更新を復元する方法です。デッドロックが起きたとき、DBMSはいずれかのトランザクションをロールバックして相互待ちを解消するので、この記述が適切です。トランザクション障害で異常終了した処理もロールバックで復旧し、ロールフォワードは媒体障害でバックアップから戻した後などに使います。他の更新を防ぎたいなら、ロックは解放しないで保持する必要があります。
解答・解説
正解はエです
この問題のテーマ
データベースの処理では、ロック・コミット・ロールバック・ロールフォワードという操作を使います。この問題は、どの操作が何のために使われ、誰が行うのかが正しい記述を選ぶ問題です。
解き方の考え方
最初に、4つの操作の目的を確かめます。ロックは他の処理からの更新を防ぐ操作です。コミットは更新を確定する操作です。ロールバックは更新を取り消して開始前の状態に戻す操作です。ロールフォワードは、ログに残った更新後の情報を再適用して復旧する操作です。次に、各選択肢の「目的」と「操作」が合っているかを照らします。目的と逆の操作や、障害の種類に合わない復旧方法を外すと、デッドロックの記述だけが残ります。
選択肢ごとの解説
- ×ア 他のトランザクションにデータを更新されないようにするために,テーブルに対するロックをアプリケーションプログラムが解放した。この肢は、更新を防ぐためにロックを解放したと言っています。更新を防ぎたいなら、ロックは保持し続ける必要があります。解放すると他のトランザクションが更新できるようになり、目的と逆になります。したがって誤りです。
- ×イ トランザクション障害が発生したので,異常終了したトランザクションをDBMSがロールフォワードした。この肢は、異常終了したトランザクションをロールフォワードしたと言っています。トランザクション障害で異常終了した処理は、途中までの更新を取り消すロールバックで復旧します。ロールフォワードは、コミット済みの更新をログから再適用する方法です。したがって、この場面には合わず誤りです。
- ×ウ トランザクションの更新結果を確定するために,トランザクションをアプリケーションプログラムがロールバックした。この肢は、更新結果を確定するためにロールバックしたと言っています。更新を確定する操作はコミットです。ロールバックは更新を取り消す操作で、確定とは逆の働きです。したがって誤りです。
- ○エ 複数のトランザクション間でデッドロックが発生したので,トランザクションをDBMSがロールバックした。この肢は、デッドロックの発生時にDBMSがロールバックしたと言っています。デッドロックとは、複数のトランザクションが互いに相手の資源の解放を待ち、どちらも進めなくなった状態です。DBMSがどれかをロールバックして資源を解放させれば、待ち合いは解消します。したがって、適切な対応で正しい記述です。
補足
よく出る引っかけは、ロールバックとロールフォワードの入れ替えと、コミットとロールバックの取り違えです。一般には、媒体障害のようにデータそのものが失われた場合は、バックアップから戻したうえでロールフォワードを行い、コミット済みの更新を復元します。障害の種類ごとに、確定済みの更新を「やり直す」のか、未確定の更新を「取り消す」のかを考えると区別しやすくなります。
POINT
- 更新を確定する操作はコミット、取り消して開始前の状態に戻す操作はロールバックです。
- トランザクション障害で異常終了した処理は、ロールバックで復旧します。
- ロールフォワードは、ログに残った更新後の情報を再適用して、コミット済みの更新を復元する方法です。
- デッドロックが起きると、DBMSがいずれかのトランザクションをロールバックして相互待ちを解消します。
- ほかのトランザクションの更新を防ぐには、ロックを解放せずに保持しておく必要があります。
