- ベストアンサー
ロールバックとロールフォワード(データベーススペシャリスト試験)
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)
- 専門家の回答
質問者が選んだベストアンサー
追加質問1への回答。 違います(違う可能性があります)。 質問文における図では t3における時刻の前後関係が読み取りにくいですが,トランザクションBのCOMMITが先でデータが確定。その後にトランザクションEが開始されてそのデータを読んでいるかもしれませんから。 追加質問2への回答。 前者はデータベース利用者が明示的に発行する"ROLLBACK"というSQL命令で, 自分が実行している1トランザクションに対してのみ対象とします。 後者はデータベース管理者がおこなう障害復旧操作で, 複数のユーザが実行している複数のトランザクションが対象となります。 ロールバックを実現する仕組みはどちらも同じですが,その対象範囲が異なります。 (1)トランザクション中のディスク書き込みについて。 「データベーススペシャリスト試験」ということですから,個別製品の技術ではなく,一般的な解答が望まれているんですよね……。 私が知っている例ですと,ORACLE Databaseという製品におけるCOMMITとは,REDOログファイルに書き込むことであって,データファイルに書き込むことではないんです。COMMIT=データファイルに書き込むこと,とは言えない例が実製品ではあるんです。 ただ,そのような製品実装に因らない一般的な解答としては,質問者が×をつけた, >コミットとチェックポイントにメモリからディスクに書き込まれ、 >それ以外では書き込まれない(メモリ上で処理される) で正しいように私は思うのですが。 この点,「それ以外にも随時書き込まれる」のはどういう場合か,No.1の回答者の方に教えていただけるなら私にとっても勉強になります。 (2)トランザクションのロールバックについて ○必ず更新前ログでディスクを上書きして終了,で正しいと思います。 >チェックポイントがあったらディスクに途中状態で書き込まれている というのは間違いでしょう。トランザクションCが確保中のデータに対して,別のトランザクションにしろチェックポイントにしろ書き込みを許すというのは,そもそも排他制御していないということで,その前提自体が間違っていると思います。 障害発生により,データファイル上に残っているデータそのものが信用できない,まだCOMMIT前でディスクには書き込まれていないので「データファイル上のデータは元のまま残っているはず」という前提が保証できない。だから,データファイル上のデータが現在どんな値であろうと,トランザクション開始時にコピーしておいた更新前データを上書きするんじゃないでしょうか。 Googleしていて次の資料を見つけました。p.28-29の説明が,特定の製品に因ることなく,分かりやすい説明だと思いました。ご参考までに。 白井 靖人(静岡大学 情報学部情報科学科・准教授) 平成19年度前期「データベース論」講義情報 第12回(7/02)障害回復,同時実行制御(講義資料) http://arc0.pico.cs.inf.shizuoka.ac.jp/~shirai/h1900zenki/database/database.html http://www.deainoba.jp/data/view_detail.php?subject_id=00769
その他の回答 (3)
- jjon-com
- ベストアンサー率61% (1599/2592)
キーワード「ロールバック ロールフォワード t0 t1 t2 t3 t4 t5」でGoogle検索して3番目にヒットする次のページに記載された「オケマツさん」の解説を参照。 http://www.melma.com/backnumber_189_2018387/ チェックポイントはデータファイルに影響を与えるだけでジャーナルファイルは扱わない。DB復旧時,ジャーナルファイルの中身に更新前情報だけが記録された中途半端な状態であるなら,それはロールバックで戻すということです。
お礼
すいません、補足の中で機種依存文字だった数字が消えてしまいました (1)トランザクション中のディスク書き込みについて ^^^^ と (2)トランザクションのロールバックについて ^^^^ です
補足
notnotさん ymmasayanさん jjon-comさん 回答ありがとうございます。 皆さんの回答を順番に何度も読み返して、少しずつ見えてきた気がします。 (ちなみにjjon-comさんの回答のリンク先が質問の発端となった過去問でした。) ※誤解を避けるため、なるべく言葉を省略せずに書くので冗長になって読みにくいかもしれませんがご容赦ください。 ※言葉の意味を誤解している可能性もありますので、私の文章で文脈・使い方がおかしい箇所が少しでもあったら指摘してもらえると助かります。 まず、私が誤解していた部分です。 ( )トランザクション中のディスク書き込みについて ×コミットとチェックポイントにメモリからディスクに書き込まれ、それ以外では書き込まれない(メモリ上で処理される) ○コミットとチェックポイントにメモリからディスクに書き込まれ、それ以外にも随時書き込まれる ( )トランザクションのロールバックについて ×ディスクには書き込まれてないのでメモリを破棄して終了 ただしチェックポイントがあったらディスクに途中状態で書き込まれているので 更新前ログでディスクを上書きする ○必ず更新前ログでディスクを上書きして終了 これで合ってるでしょうか? さらに質問ですが 追加質問1 トランザクションEで更新するデータについて 「チェックポイントでディスクに書き込まれる値」と「トランザクションEの更新前ログの値」は同じですか? 追加質問2 トランザクション処理において「一連のデータベース操作を取り消す」意味のロールバックと システム障害の復旧手順の「undoリストと更新前ログを使用してデータベースをロールバックする」のロールバックは同じものを差していますか?
- ymmasayan
- ベストアンサー率30% (2593/8599)
Eをt5の状態から続行する手段はありません。 従ってロールバックして再起動を掛けるしかないのです。 全てのトランザクションはsの状態かeの状態に戻すしかないのです。
お礼
回答ありがとうございます No.3でまとめて返事を書かせてもらいました
- notnot
- ベストアンサー率47% (4900/10358)
t3からt5の間にはチェックポイントがないので、トランザクションEの中で発生したDB更新が、DBディスクに書き込まれたかどうかはっきりしません。書き込まれている可能性もあります。従って、ロールバックが必要です。 おそらく、ディスクへの書き込みが、チェックポイントの時にまとめて行われると勘違いしているのでしょうね。違います。
お礼
回答ありがとうございます No.3でまとめて返事を書かせてもらいました
お礼
もう少し意見を聞いてみたい気もしますが、 最初の疑問は解決しましたし、 試験に必要な部分は理解できましたのでこれで〆ます。 皆さんありがとうございましたm(_ _)m
補足
回答ありがとうございます >トランザクションBのCOMMITが先でデータが確定。その後にトランザクションEが開始されてそのデータを読んでいるかもしれません 今回は情報処理試験対策のつもりで質問させてもらってます。 なので「トランザクションBとEは別々のデータを対象としている」前提で話をしてました。すみません。 でも、もし実務だったらご指摘の状況も想定しておかないといけませんね。 それからデータベースもOracleやSQL Serverよりも「試験で出題されるデータベース」が望ましいです(笑) でも個別製品の話題も歓迎です。実務でDML使ってソフト開発してますが内部の動作を意識することはないので勉強になります。 >>チェックポイントがあったらディスクに途中状態で書き込まれている >トランザクションCが確保中のデータに対して,別のトランザクションにしろチェックポイントにしろ書き込みを許すというのは,そもそも排他制御していない この部分ですが「ディスクに途中状態で書き込まれている」というのは チェックポイントで「(トランザクション開始時にディスクからコピーした)メモリ上のデータを元のディスクに書き込んで同期させる」という意味です。 表現が曖昧でした。すみません。 でも別のトランザクションが書き込んでいたら排他制御してないことになりますね。 この話題に関連して参考書に次のように書かれてました。(情報の後出しになって申し訳ありません) チェックポイントの実行手順 具体的な実行手順は以下の通りである 【1】すべての実行中のトランザクションを一時停止する 【2】メモリの内容を強制的にデータベースに書き出す 【3】チェックポイントレコードをログに書き出す 【4】一時停止させていたトランザクションを再開する 私の書いた「ディスクに途中状態で書き込まれている」というのは【2】の部分です。 No.4の回答を読んで、最初の疑問についても、根本的に考え違いをしていたのがなんとなくわかってきました。 ×(トランザクションEの更新前ログとチェックポイントログは)同じ値になるはずだから、書き込むのは無駄である。無駄な処理はしないほうがよい ○(トランザクションEの更新前ログとチェックポイントログは)同じ値になる保証はない だからチェックポイントログ、更新前ログ、更新後ログの3つのうち、一番新しいログで上書きするのが正しい(間違いが起こりにくい) (チェックポイントログというのは上記【3】のログのことです) 紹介していただいたページ、大変参考になります!ありがとうございました。