• ベストアンサー

ロールバックについて

トランザクション障害が起きた場合、 ログファイルの更新前情報によってロールバックするらしいのですが、 この更新前情報というのはいつログファイルに書き出されたのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.7

No.4のymmasayanです。補足質問にお答えします。 かなり、話が混線してきていますので、先に整理しておきます。 まず障害回復には、 1.トランザクション単体のロールバック と、 2.ハード障害、DBMS障害、OS障害などによる全体障害回復 の2つがあります。これが混線しています。 1は更新前ログだけあればロールバックできます。 2は更新前ログ、更新後ログ、チェックポイントなどをとります。 障害発生時に、最新のチェックポイントを基準に、ロールバックとロールフォワードを使い、回復します。 蛇足ですが、2種類の更新前ログは別々の場所にとられます。 回答です。 > トランザクション開始時と障害時までの間にチェックポイントが無いという前提で書いてました。 > なのでトランザクション障害時に更新前ログがバッファには存在しても、 > チェックポイントを通っていないのでログファイルには存在しないと思うのです。 >もしくはトランザクション開始時より前のチェックポイントで記録した > 更新前ログを使うということだとすると、 > チェックポイント時点には戻れてもその後にあったトランザクション開始時には > 戻れない気がするのです…。 上に書いたように、トランザクション単体のロールバックであればチェックポイントは無関係です。 全体ダウンの時ならチェックポイントが関係します。 ついでに、単体ロールバック用の更新前ログはバッファリングによる消失は考える必要は有りません。

flamer
質問者

お礼

理解できました!ありがとうございますm(_ _)m

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • notnot
  • ベストアンサー率47% (4856/10271)
回答No.6

#2です。 >前回のチェックポイントより、障害が起きたトランザクションの開始時の方が後の場合、 #4の方の説明が参考になるかと思いますが、個々のトランザクションでは、 ・トランザクション開始 ・トランザクション正常終了(コミット) ・トランザクション異常終了(ロールバック) の3つだけ考えればいいです。 DBMSやOLTPでチェックポイントというものがありますが、それは個々のトランザクションとは関係なく、DBMSやOLTP自身の障害時の回復のためのものです。

flamer
質問者

お礼

ご返答ありがとうございます。勉強になります。

全文を見る
すると、全ての回答が全文表示されます。
回答No.5

トランザクション処理は、ミッションクリティカル部分で利用されていますのでデータベースだけとは限らないです。 トランザクションの基本は 情報を更新する際、 更新前の状態を保持しており、更新途中に障害が発生しても 更新前に戻す事を可能にする事です。 また、正常に更新された後では、更新前に戻すことは トランザクション処理ではできません。 >>この更新前情報というのはいつログファイルに書き出されたのでしょうか? トランザクションの宣言をした時に確保されます。 逆言うとトランザクションの宣言がされていないと 確保されませんので整合性が取れなくなる可能性があります

flamer
質問者

お礼

ご返答ありがとうございます。 >トランザクションの宣言をした時に確保されます。 ログファイルにログが書き込まれるのはコミット時とチェックポイント時だけかと思っていたのですが、 トランザクション開始時(開始時=宣言時ですよね?)もそうだということで良いでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

この問題はDB更新とログの書き出しをバッファリングしているかどうかによって、 説明が違ってきます。 方式としては、 1.DBの書き出しもR/Wログもバッファリングしない。 2.DBの書き出しのみバッファリングする。 3.両方ともバッファリングする。 の3つが有ります。 歴史的には1→2→3の順に進んできました。 目的は処理性能向上ですがそれだけ回復処理が複雑になります。 では3を前提に回答しましょう。 DBの書き出しも更新前/更新後ログもバッファリングされていますので 必ずログの方を先に書き出すようにします。 チェックポイントでは瞬間的に全タスク(プロセス)を停めて、 バッファリングされているR/Wログの書き出しとDBの書き出しをした後、 チェックポイントログを書き出します。ここで、バッファリングが0になります。 > この更新前情報というのはいつログファイルに書き出されたのでしょうか? 上の説明でほぼお判りだと思いますがDBを読み込んだら、 即、更新前ログを書きます。 ただ、本当にログに書き出す場合と、メモリー上のバッファーに書き出す場合とが あるということです。

flamer
質問者

お礼

ご返答ありがとうございます。 トランザクション開始時と障害時までの間にチェックポイントが無いという前提で書いてました。言葉足らずですみません。 なのでトランザクション障害時に更新前ログがバッファには存在しても、 チェックポイントを通っていないのでログファイルには存在しないと思うのです。 もしくはトランザクション開始時より前のチェックポイントで記録した更新前ログを使うということだとすると、 チェックポイント時点には戻れてもその後にあったトランザクション開始時には戻れない気がするのです…。 チェックポイント時の動作の説明はとてもわかりやすかったです。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • NAATAN
  • ベストアンサー率33% (57/170)
回答No.3

あくまでも情報処理試験対策として私が勉強し、理解している範囲でのお答えになりますが。 チェックポイント時にはトランザクションが開始されていない。ということは、DBが更新されていない。ということになります。 「ログファイルの更新前情報によってロールバックする」ということは、トランザクション開始前の状態にするということになりますので、その後はトランザクションの再処理によって、障害発生時の状態まで戻します。

flamer
質問者

お礼

ご返答ありがとうございます。 ロールバック自体はなんとなくわかるのですが、更新前情報がログファイルに書き出されるタイミングが気になったので・・・。 質問が分かりづらくてすみません。

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4856/10271)
回答No.2

DB更新の前です。 更新前情報がログに確実に書かれてからDBが実際に更新されます。 逆に言うと更新前情報が書かれない限りDBは更新されません。

flamer
質問者

お礼

ご返答ありがとうございます。 チェックポイントでDBが更新される直前に、更新前ログが書き出されるということでしょうか? そうだとすると前回のチェックポイントより、障害が起きたトランザクションの開始時の方が後の場合、 チェックポイント時のログでトランザクション開始時の状態にするのは難しいような気がするのですが・・・。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

なんのトランザクション処理なのかがいまいち分からないのでその辺補足した方がよいです

flamer
質問者

お礼

ご返答ありがとうございます。 なんのトランザクション処理かは意識していなかったのですが、 ただ単にトランザクション・・・では駄目でしょうか。 うまく補足ができなくてごめんなさい。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • チェックポイントとロールバックのタイミングについて。

    下記のパターンの際に、transaction logファイルに書き込まれるのか否かを教えて下さい。 A:チェックポイントをまたがったトランザクションで完了後にシステム障害が発生した場合。 =>私の認識では、ロールフォワードによって、データベースとtransaction logファイルにデータが書き込まれる。と考えているのですが、正しいでしょうか? B:チェックポイントを一度も通らずに、トランザクションが完了。完了後にシステム障害が発生。 =>Aと同じですか? C:トランザクション実行中にシステム障害が発生した場合。 =>ロールバックされて、transaction logファイルにのみ書き込まれて、データベースには書き込まれない。というのは正しいでしょうか? よろしくお願いします^^

  • ロールバックとチェックポイント関連で質問です。

    下記のパターンの際に、transaction logファイルに書き込まれるのか否かを教えて下さい。 A:チェックポイントをまたがったトランザクションで完了後にシステム障害が発生した場合。 =>私の認識では、ロールフォワードによって、データベースとtransaction logファイルにデータが書き込まれる。と考えているのですが、正しいでしょうか? B:チェックポイントを一度も通らずに、トランザクションが完了。完了後にシステム障害が発生。 =>Aと同じですか? C:トランザクション実行中にシステム障害が発生した場合。 =>ロールバックされて、transaction logファイルにのみ書き込まれて、データベースには書き込まれない。というのは正しいでしょうか? よろしくお願いします^^

  • ロールバックとロールフォワード(データベーススペシャリスト試験)

      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の更新前ファイルを使ってデータをロールバックする必要はないように思えます。 どこで間違っているでしょうか。。。

  • トランザクションを張って対話型でのコミット・ロール

    トランザクションを張って更新処理を行った後に、 ユーザの「はい」「いいえ」ボタンによって、 トランザクションのコミットとロールバックを切り替えることは可能でしょうか。 処理の流れは以下の様になります。 1.データ更新前の値を取得 2.トランザクションの開始 3.データ更新 4.データ更新前の値とデータ更新後の値を比較して、   差分がある場合は確認メッセージを表示する。 5.確認メッセージで「はい」がクリックされた場合はコミットする。 6.確認メッセージで「いいえ」がクリックされた場合はロールバックする。 実装方法はどのようでも構いません。 どなたかご教授ください。

  • 障害回復(ロールバックとロールフォワード)について

      t0  t1  t2   t3   t4   t5        |           | A s---e   |           |         |           | B s-------------e        |         |           | C  s------------------------|         |           | D       |   s----e    |         |           | E       |    s---------| ※t2はチェックポイント、t5は障害発生 ロールバックとロールフォワードについて教えてください。 (1)BとEについてロールフォワードによる回復が必要とのことですが、障害発生前にトランザクションが終了しており、コミットされているはずなのに、なぜロールフォワードが必要なのでしょうか? (2)Aはチェックポイント前に処理が完了しているため、回復処理は不要とのことですが、BとEが必要でAが不要の違いわかりません。 よろしくお願いします。

  • オフライン中のトランザクションについて

    表領域をオフラインにした場合、オフライン前に開始されたトランザクションは有効ですが、オフラインのまま、コミット、または、ロールバックして、表領域をオンラインにしても、整合がとれるのはなぜなのでしょうか。 コミットするか、ロールバックするかの情報はどこに保持してるのか疑問です。 (オフラインにしてから、ファイルをリネームし、 トランザクションをロールバックして、 ログをアーカイブし、DB再起動後に、ファイル名を戻して、 オンラインにすると、ちゃんとロールバックされています。 同じ操作で、コミットするとちゃんとコミットされています。 知っている方には当然なのでしょうが、私にとっては、不思議です) 詳しい方がみえましたらご教授お願いいたします。

  • ロールバック

    早速ご教示ください。 DELETE FROM テーブル名 この構文を用いて、テーブルを削除したいと考えております。 参考書で調べたところ、TURNCATE TABLE文だとロールバックできないが、処理が高速と記述してあります。 DELETE FROM TABLE文だとロールバックできない状態での削除は注意してくださいとあります。 つまりは、DELETE FROM TABLE文だとロールバックできる状態での削除なら削除前に戻せると言うことなのでしょうか? (1)ロールバックってなんですか? (2)ロールバックできる状態、できない状態。その両方の状態をご教示く ださい。  またロールバックはどのように行うのでしょうか? 以上、ご教示の程宜しくお願い致します。

  • ロールバック セグメントの指定

    バッチ処理にてCOMMIT間隔が大き過ぎてエクステントの拡張が発生しました。 エクステントを拡張は避けたく、COMMIT間隔を小さくしたのですが、 改善効果を、確認したいと思っております。 他のトランザクションもある試験環境なので、alter文?にてバッチ処理が 使用するロールバックセグメント番号を指定し、改善前/後で、V$ROLLSTATで確認 したいのですが、実施方法をご教授頂けないでしょうか? ※ロールバック・セグメント番号 = V$ROLLSTAT.USN

  • WMP10のロールバックが出来ない

    WMP10を9に戻したいのですが、コントロールパネルのプログラムの追加と削除でWindows XP-ソフトウェアの更新の中のWindowsMediaPlayer10の変更と削除のボタンをクリックしロールバックしますかのメッセージが出て、クリックすると直ぐ終了し「ロールバック完了しました」と出ますが、10のままです。 どうしたら出来るのでしょうか? 宜しくご教示下さい。

  • ロールバックの逆の言葉は?

    現在ファイルのバックアップとバージョン管理を行う簡単なツールを作成しているのですが、その際にロールバックから復帰するいい言葉がわからず悩んでいます。 例えばチェックポイントが10個ある場合(v1~10)、バージョン6(過去のバージョン)に戻る作業がロールバックです。 その後、再びバージョン10に復帰することも可能で、この終端のバージョンに復帰する作業のよさげな名前を探しています。 昔VSS少し使っていたことがあって、ロールバックという言葉は覚えていたのですが、残念ながらそのもどし方の名前は忘れてしまいました。 よろしくおねがいします。

専門家に質問してみよう