- ベストアンサー
ロールバックとロールフォワード(データベーススペシャリスト試験)
t0 t1 t2 t3 t4 t5 | | A s---e | | | | B s-------------e | | | C s------------------------| | | D | s----e | | | E | s---------| 図がずれていたらごめんなさい。 A~Eはトランザクション sはトランザクション開始 eはコミット t0~t5は時間を表していて 時間t2でチェックポイント 時間t5で障害が発生したとします。 参考書によると復旧時に CとEはロールバックを行い、 BとDはロールフォワードを行うとあります。 B、C、Dはわかるのですが Eにロールバックが必要な理由がわかりません Eを再び実行するためにはデータは トランザクションを開始したt3時点の状態であればよいはずです。 そしてチェックポイント(=t2)の状態はt3と同じなので、 Eの更新前ファイルを使ってデータをロールバックする必要はないように思えます。 どこで間違っているでしょうか。。。
- みんなの回答 (4)
- 専門家の回答
お礼
もう少し意見を聞いてみたい気もしますが、 最初の疑問は解決しましたし、 試験に必要な部分は理解できましたのでこれで〆ます。 皆さんありがとうございましたm(_ _)m
補足
回答ありがとうございます >トランザクションBのCOMMITが先でデータが確定。その後にトランザクションEが開始されてそのデータを読んでいるかもしれません 今回は情報処理試験対策のつもりで質問させてもらってます。 なので「トランザクションBとEは別々のデータを対象としている」前提で話をしてました。すみません。 でも、もし実務だったらご指摘の状況も想定しておかないといけませんね。 それからデータベースもOracleやSQL Serverよりも「試験で出題されるデータベース」が望ましいです(笑) でも個別製品の話題も歓迎です。実務でDML使ってソフト開発してますが内部の動作を意識することはないので勉強になります。 >>チェックポイントがあったらディスクに途中状態で書き込まれている >トランザクションCが確保中のデータに対して,別のトランザクションにしろチェックポイントにしろ書き込みを許すというのは,そもそも排他制御していない この部分ですが「ディスクに途中状態で書き込まれている」というのは チェックポイントで「(トランザクション開始時にディスクからコピーした)メモリ上のデータを元のディスクに書き込んで同期させる」という意味です。 表現が曖昧でした。すみません。 でも別のトランザクションが書き込んでいたら排他制御してないことになりますね。 この話題に関連して参考書に次のように書かれてました。(情報の後出しになって申し訳ありません) チェックポイントの実行手順 具体的な実行手順は以下の通りである 【1】すべての実行中のトランザクションを一時停止する 【2】メモリの内容を強制的にデータベースに書き出す 【3】チェックポイントレコードをログに書き出す 【4】一時停止させていたトランザクションを再開する 私の書いた「ディスクに途中状態で書き込まれている」というのは【2】の部分です。 No.4の回答を読んで、最初の疑問についても、根本的に考え違いをしていたのがなんとなくわかってきました。 ×(トランザクションEの更新前ログとチェックポイントログは)同じ値になるはずだから、書き込むのは無駄である。無駄な処理はしないほうがよい ○(トランザクションEの更新前ログとチェックポイントログは)同じ値になる保証はない だからチェックポイントログ、更新前ログ、更新後ログの3つのうち、一番新しいログで上書きするのが正しい(間違いが起こりにくい) (チェックポイントログというのは上記【3】のログのことです) 紹介していただいたページ、大変参考になります!ありがとうございました。