- - PR -
ロールバックとロールフォワードの仕組みについて
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-23 01:21
ロールバックとロールフォワードの仕組みについて質問が二点ございます.
【質問1】 トランザクション2(T2)において,ロールバックを行った場合, 以下のどちらに戻るのでしょうか? 個人的には,トランザクション処理の開始時点に戻る気がします. しかし,チェックポイントがあるなら,わざわざトランザクション処理の開始時点まで 戻る必要がない気もします. ・トランザクション処理の開始時点(1)に戻り,障害発生時までの再処理をおこなう ・チェックポイント(2)まで戻り,障害発生時までの再処理をおこなう 【質問2】 トランザクション3(T3)において,チェックポイントからコミット時までの処理 ((3)〜(4)までの処理)の結果は,DB本体には書き出されていないという 認識で宜しいでしょうか? システム障害発生時の システム障害発生 チェックポイント | ――――┼―――――――――――――――┼―――――→ T1 | | 時間 ├――┤| | | T2 | ├―┼―――――――――――――――┼………┤ (1)(2) |T3 | ├――┼――――┤ | | (3) (4) | ||||||||||||
|
投稿日時: 2006-08-23 03:01
とりあえず、Oracleの実装を例にして回答します。
私の知っているDBMSでは(1)に戻るだけです。障害発生後にDBMSの利用者が どんな更新をしようとしていたかなんてDBMSにはわからないので。
ロールバックされるT2は「元から存在しなかった」ものとされるので、 障害発生時までの再処理もされずに闇に葬り去られます。
確かにコミット後にチェックポイントは経過していませんが、 WAL(Write Ahead Log)にはコミットが確実に書き込まれていますし、 コミット前にデータファイル(バッファ含む)に書き込み始める実装な DBMSも普通に使われています(少なくともOracleはそうです)。 というわけで、チェックポイント前にDB本体に書き出すこともあります。 この時点ではデータファイルへの反映が完了している保証はないですが。 チェックポイント前に障害が発生したので「書き出されていない」、 ではなく、「更新の反映が完了している保証がない」という表現の方が 適切だと思います。この保証を行うための処理がチェックポイントなので。 | ||||||||||||
|
投稿日時: 2006-08-24 13:33
Oracleの実装を例にして説明して頂いたため,具体的なイメージができました.
ありがとうございます.
了解しました. 加えて質問をさせて下さい. 1 2 3 4 5 ├――┼――――┤ | | 1:トランザクションの開始 2:チェックポイント 3:コミット 4:障害発生 5:チェックポイント 一般的には,1−2の間の処理は,DB本体には 書き出されていないという認識で宜しいでしょうか. (3の時点で,メモリのバッファ上にWALが書き出される) Oracleの場合なども含め,5のチェックポイント前に障害が発生したので, 「更新の反映が完了している保証がない」という認識で よろしいでしょうか? | ||||||||||||
|
投稿日時: 2006-08-24 14:05
バッファだけでなくWALのファイルにも書き出されますよ。 OracleであればREDOログバッファの1/3を使った場合などです。 トランザクション中にWALに書き込む事が可能な理由は、 「コミットの確定 = WALにコミットレコードが存在する」 という条件で判断しているからです。 実装としては、コミットレコードをWALのファイルに書き込み、 さらに、書き込みがストレージにフラッシュされた事を確認して コミット完了とするのが一般的です。 この辺りの考え方はデータファイルの場合も似ています。 リカバリ(Oracleならメディアリカバリ)を行う際には、 正常終了した最後のチェックポイント以降のWALを再生しながら、 コミットレコードの有無でコミット/ロールバックを判断します。
4で障害が発生したので、5のチェックポイントはありえません。 チェックポイント前にリカバリが必要なので、5のチェックポイントを 行えるようになった時点では、障害そのものが無かったものと同じです。 | ||||||||||||
|
投稿日時: 2006-08-24 14:30
ちょっと訂正します。
障害発生時まで再生してロールバックする実装の方が普通でしょう。 ロールバック=「元から存在しなかった」ようにする、という意味でです。
「障害そのものが無かったものと同じ」とは、未コミットの場合は 当然ロールバックが起こるので、そのトランザクションの実行者に とっては確実に障害は発生しているわけですが。 DBMSにとっては未コミットのトランザクションは保証対象外なので。 | ||||||||||||
|
投稿日時: 2006-08-24 20:06
アドバイスありがとうございます. ご指摘&以下のURLなどの情報から, 私自身のWALの解釈が間違っている事に気付きました. 具体的には,メモリのバッファ領域に,WALがあると勘違いしておりました. 実際には,データベースへの更新記録は、ディスク領域に有るWALログという 特別なファイルに同期書き込みを使って行われる」事がわかりました. https://www.thinkit.co.jp/free/marugoto/2/1/12/1.html |
1