- ベストアンサー
ロールバックについて
トランザクション障害が起きた場合、 ログファイルの更新前情報によってロールバックするらしいのですが、 この更新前情報というのはいつログファイルに書き出されたのでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No.4のymmasayanです。補足質問にお答えします。 かなり、話が混線してきていますので、先に整理しておきます。 まず障害回復には、 1.トランザクション単体のロールバック と、 2.ハード障害、DBMS障害、OS障害などによる全体障害回復 の2つがあります。これが混線しています。 1は更新前ログだけあればロールバックできます。 2は更新前ログ、更新後ログ、チェックポイントなどをとります。 障害発生時に、最新のチェックポイントを基準に、ロールバックとロールフォワードを使い、回復します。 蛇足ですが、2種類の更新前ログは別々の場所にとられます。 回答です。 > トランザクション開始時と障害時までの間にチェックポイントが無いという前提で書いてました。 > なのでトランザクション障害時に更新前ログがバッファには存在しても、 > チェックポイントを通っていないのでログファイルには存在しないと思うのです。 >もしくはトランザクション開始時より前のチェックポイントで記録した > 更新前ログを使うということだとすると、 > チェックポイント時点には戻れてもその後にあったトランザクション開始時には > 戻れない気がするのです…。 上に書いたように、トランザクション単体のロールバックであればチェックポイントは無関係です。 全体ダウンの時ならチェックポイントが関係します。 ついでに、単体ロールバック用の更新前ログはバッファリングによる消失は考える必要は有りません。
その他の回答 (6)
- notnot
- ベストアンサー率47% (4900/10358)
#2です。 >前回のチェックポイントより、障害が起きたトランザクションの開始時の方が後の場合、 #4の方の説明が参考になるかと思いますが、個々のトランザクションでは、 ・トランザクション開始 ・トランザクション正常終了(コミット) ・トランザクション異常終了(ロールバック) の3つだけ考えればいいです。 DBMSやOLTPでチェックポイントというものがありますが、それは個々のトランザクションとは関係なく、DBMSやOLTP自身の障害時の回復のためのものです。
お礼
ご返答ありがとうございます。勉強になります。
- Aruku-20030515
- ベストアンサー率23% (362/1544)
トランザクション処理は、ミッションクリティカル部分で利用されていますのでデータベースだけとは限らないです。 トランザクションの基本は 情報を更新する際、 更新前の状態を保持しており、更新途中に障害が発生しても 更新前に戻す事を可能にする事です。 また、正常に更新された後では、更新前に戻すことは トランザクション処理ではできません。 >>この更新前情報というのはいつログファイルに書き出されたのでしょうか? トランザクションの宣言をした時に確保されます。 逆言うとトランザクションの宣言がされていないと 確保されませんので整合性が取れなくなる可能性があります
お礼
ご返答ありがとうございます。 >トランザクションの宣言をした時に確保されます。 ログファイルにログが書き込まれるのはコミット時とチェックポイント時だけかと思っていたのですが、 トランザクション開始時(開始時=宣言時ですよね?)もそうだということで良いでしょうか。
- ymmasayan
- ベストアンサー率30% (2593/8599)
この問題はDB更新とログの書き出しをバッファリングしているかどうかによって、 説明が違ってきます。 方式としては、 1.DBの書き出しもR/Wログもバッファリングしない。 2.DBの書き出しのみバッファリングする。 3.両方ともバッファリングする。 の3つが有ります。 歴史的には1→2→3の順に進んできました。 目的は処理性能向上ですがそれだけ回復処理が複雑になります。 では3を前提に回答しましょう。 DBの書き出しも更新前/更新後ログもバッファリングされていますので 必ずログの方を先に書き出すようにします。 チェックポイントでは瞬間的に全タスク(プロセス)を停めて、 バッファリングされているR/Wログの書き出しとDBの書き出しをした後、 チェックポイントログを書き出します。ここで、バッファリングが0になります。 > この更新前情報というのはいつログファイルに書き出されたのでしょうか? 上の説明でほぼお判りだと思いますがDBを読み込んだら、 即、更新前ログを書きます。 ただ、本当にログに書き出す場合と、メモリー上のバッファーに書き出す場合とが あるということです。
お礼
ご返答ありがとうございます。 トランザクション開始時と障害時までの間にチェックポイントが無いという前提で書いてました。言葉足らずですみません。 なのでトランザクション障害時に更新前ログがバッファには存在しても、 チェックポイントを通っていないのでログファイルには存在しないと思うのです。 もしくはトランザクション開始時より前のチェックポイントで記録した更新前ログを使うということだとすると、 チェックポイント時点には戻れてもその後にあったトランザクション開始時には戻れない気がするのです…。 チェックポイント時の動作の説明はとてもわかりやすかったです。ありがとうございます。
- NAATAN
- ベストアンサー率33% (57/170)
あくまでも情報処理試験対策として私が勉強し、理解している範囲でのお答えになりますが。 チェックポイント時にはトランザクションが開始されていない。ということは、DBが更新されていない。ということになります。 「ログファイルの更新前情報によってロールバックする」ということは、トランザクション開始前の状態にするということになりますので、その後はトランザクションの再処理によって、障害発生時の状態まで戻します。
お礼
ご返答ありがとうございます。 ロールバック自体はなんとなくわかるのですが、更新前情報がログファイルに書き出されるタイミングが気になったので・・・。 質問が分かりづらくてすみません。
- notnot
- ベストアンサー率47% (4900/10358)
DB更新の前です。 更新前情報がログに確実に書かれてからDBが実際に更新されます。 逆に言うと更新前情報が書かれない限りDBは更新されません。
お礼
ご返答ありがとうございます。 チェックポイントでDBが更新される直前に、更新前ログが書き出されるということでしょうか? そうだとすると前回のチェックポイントより、障害が起きたトランザクションの開始時の方が後の場合、 チェックポイント時のログでトランザクション開始時の状態にするのは難しいような気がするのですが・・・。
- Aruku-20030515
- ベストアンサー率23% (362/1544)
なんのトランザクション処理なのかがいまいち分からないのでその辺補足した方がよいです
お礼
ご返答ありがとうございます。 なんのトランザクション処理かは意識していなかったのですが、 ただ単にトランザクション・・・では駄目でしょうか。 うまく補足ができなくてごめんなさい。
お礼
理解できました!ありがとうございますm(_ _)m