重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (7件)

No.4のymmasayanです。

補足質問にお答えします。

かなり、話が混線してきていますので、先に整理しておきます。
まず障害回復には、
1.トランザクション単体のロールバック と、
2.ハード障害、DBMS障害、OS障害などによる全体障害回復
の2つがあります。これが混線しています。

1は更新前ログだけあればロールバックできます。
2は更新前ログ、更新後ログ、チェックポイントなどをとります。
障害発生時に、最新のチェックポイントを基準に、ロールバックとロールフォワードを使い、回復します。

蛇足ですが、2種類の更新前ログは別々の場所にとられます。

回答です。

> トランザクション開始時と障害時までの間にチェックポイントが無いという前提で書いてました。
> なのでトランザクション障害時に更新前ログがバッファには存在しても、
> チェックポイントを通っていないのでログファイルには存在しないと思うのです。
>もしくはトランザクション開始時より前のチェックポイントで記録した
> 更新前ログを使うということだとすると、
> チェックポイント時点には戻れてもその後にあったトランザクション開始時には
> 戻れない気がするのです…。

上に書いたように、トランザクション単体のロールバックであればチェックポイントは無関係です。
全体ダウンの時ならチェックポイントが関係します。
ついでに、単体ロールバック用の更新前ログはバッファリングによる消失は考える必要は有りません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/20 22:39

#2です。


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

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

お礼日時:2005/03/19 04:03

トランザクション処理は、ミッションクリティカル部分で利用されていますのでデータベースだけとは限らないです。



トランザクションの基本は
情報を更新する際、
更新前の状態を保持しており、更新途中に障害が発生しても
更新前に戻す事を可能にする事です。
また、正常に更新された後では、更新前に戻すことは
トランザクション処理ではできません。

>>この更新前情報というのはいつログファイルに書き出されたのでしょうか?
トランザクションの宣言をした時に確保されます。
逆言うとトランザクションの宣言がされていないと
確保されませんので整合性が取れなくなる可能性があります
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/19 03:58

この問題はDB更新とログの書き出しをバッファリングしているかどうかによって、


説明が違ってきます。

方式としては、
1.DBの書き出しもR/Wログもバッファリングしない。
2.DBの書き出しのみバッファリングする。
3.両方ともバッファリングする。
の3つが有ります。
歴史的には1→2→3の順に進んできました。
目的は処理性能向上ですがそれだけ回復処理が複雑になります。

では3を前提に回答しましょう。
DBの書き出しも更新前/更新後ログもバッファリングされていますので
必ずログの方を先に書き出すようにします。

チェックポイントでは瞬間的に全タスク(プロセス)を停めて、
バッファリングされているR/Wログの書き出しとDBの書き出しをした後、
チェックポイントログを書き出します。ここで、バッファリングが0になります。

> この更新前情報というのはいつログファイルに書き出されたのでしょうか?
上の説明でほぼお判りだと思いますがDBを読み込んだら、
即、更新前ログを書きます。
ただ、本当にログに書き出す場合と、メモリー上のバッファーに書き出す場合とが
あるということです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/19 03:56

あくまでも情報処理試験対策として私が勉強し、理解している範囲でのお答えになりますが。



チェックポイント時にはトランザクションが開始されていない。ということは、DBが更新されていない。ということになります。

「ログファイルの更新前情報によってロールバックする」ということは、トランザクション開始前の状態にするということになりますので、その後はトランザクションの再処理によって、障害発生時の状態まで戻します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/19 03:47

DB更新の前です。


更新前情報がログに確実に書かれてからDBが実際に更新されます。
逆に言うと更新前情報が書かれない限りDBは更新されません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/18 07:32

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/18 07:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!