- PR -

ロールバックとロールフォワードの仕組みについて

1
投稿者投稿内容
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 2006-08-23 01:21
ロールバックとロールフォワードの仕組みについて質問が二点ございます.

【質問1】

トランザクション2(T2)において,ロールバックを行った場合,
以下のどちらに戻るのでしょうか?
個人的には,トランザクション処理の開始時点に戻る気がします.
しかし,チェックポイントがあるなら,わざわざトランザクション処理の開始時点まで
戻る必要がない気もします.

 ・トランザクション処理の開始時点(1)に戻り,障害発生時までの再処理をおこなう

 ・チェックポイント(2)まで戻り,障害発生時までの再処理をおこなう

【質問2】
トランザクション3(T3)において,チェックポイントからコミット時までの処理
((3)〜(4)までの処理)の結果は,DB本体には書き出されていないという
認識で宜しいでしょうか?


   システム障害発生時の      システム障害発生
    チェックポイント           |
   ――――┼―――――――――――――――┼―――――→
    T1 |               |     時間
   ├――┤|               |
       |      T2       |
     ├―┼―――――――――――――――┼………┤

    (1)(2)

       |T3             |
    ├――┼――――┤          |
       |    

       (3)  (4)
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-08-23 03:01
とりあえず、Oracleの実装を例にして回答します。

引用:

banbooさんの書き込み (2006-08-23 01:21) より:
トランザクション2(T2)において,ロールバックを行った場合,
以下のどちらに戻るのでしょうか?



私の知っているDBMSでは(1)に戻るだけです。障害発生後にDBMSの利用者が
どんな更新をしようとしていたかなんてDBMSにはわからないので。

引用:

・チェックポイント(2)まで戻り,障害発生時までの再処理をおこなう



ロールバックされるT2は「元から存在しなかった」ものとされるので、
障害発生時までの再処理もされずに闇に葬り去られます。

引用:

トランザクション3(T3)において,チェックポイントからコミット時までの処理
((3)〜(4)までの処理)の結果は,DB本体には書き出されていないという
認識で宜しいでしょうか?



確かにコミット後にチェックポイントは経過していませんが、
WAL(Write Ahead Log)にはコミットが確実に書き込まれていますし、
コミット前にデータファイル(バッファ含む)に書き込み始める実装な
DBMSも普通に使われています(少なくともOracleはそうです)。

というわけで、チェックポイント前にDB本体に書き出すこともあります。
この時点ではデータファイルへの反映が完了している保証はないですが。

チェックポイント前に障害が発生したので「書き出されていない」、
ではなく、「更新の反映が完了している保証がない」という表現の方が
適切だと思います。この保証を行うための処理がチェックポイントなので。
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 2006-08-24 13:33
Oracleの実装を例にして説明して頂いたため,具体的なイメージができました.
ありがとうございます.

引用:

・私の知っているDBMSでは(1)に戻るだけです。障害発生後にDBMSの利用者が
どんな更新をしようとしていたかなんてDBMSにはわからないので。

・ロールバックされるT2は「元から存在しなかった」ものとされるので、
障害発生時までの再処理もされずに闇に葬り去られます。




了解しました.

加えて質問をさせて下さい.

1  2    3 4 5
├――┼――――┤ | |

1:トランザクションの開始
2:チェックポイント
3:コミット
4:障害発生
5:チェックポイント

一般的には,1−2の間の処理は,DB本体には
書き出されていないという認識で宜しいでしょうか.
(3の時点で,メモリのバッファ上にWALが書き出される)

Oracleの場合なども含め,5のチェックポイント前に障害が発生したので,
「更新の反映が完了している保証がない」という認識で
よろしいでしょうか?
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-08-24 14:05
引用:

banbooさんの書き込み (2006-08-24 13:33) より:
一般的には,1−2の間の処理は,DB本体には
書き出されていないという認識で宜しいでしょうか.
(3の時点で,メモリのバッファ上にWALが書き出される)



バッファだけでなくWALのファイルにも書き出されますよ。
OracleであればREDOログバッファの1/3を使った場合などです。

トランザクション中にWALに書き込む事が可能な理由は、
「コミットの確定 = WALにコミットレコードが存在する」
という条件で判断しているからです。

実装としては、コミットレコードをWALのファイルに書き込み、
さらに、書き込みがストレージにフラッシュされた事を確認して
コミット完了とするのが一般的です。

この辺りの考え方はデータファイルの場合も似ています。

リカバリ(Oracleならメディアリカバリ)を行う際には、
正常終了した最後のチェックポイント以降のWALを再生しながら、
コミットレコードの有無でコミット/ロールバックを判断します。

引用:

Oracleの場合なども含め,5のチェックポイント前に障害が発生したので,
「更新の反映が完了している保証がない」という認識で
よろしいでしょうか?



4で障害が発生したので、5のチェックポイントはありえません。
チェックポイント前にリカバリが必要なので、5のチェックポイントを
行えるようになった時点では、障害そのものが無かったものと同じです。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-08-24 14:30
ちょっと訂正します。

引用:

ロールバックされるT2は「元から存在しなかった」ものとされるので、
障害発生時までの再処理もされずに闇に葬り去られます。



障害発生時まで再生してロールバックする実装の方が普通でしょう。
ロールバック=「元から存在しなかった」ようにする、という意味でです。

引用:

4で障害が発生したので、5のチェックポイントはありえません。
チェックポイント前にリカバリが必要なので、5のチェックポイントを
行えるようになった時点では、障害そのものが無かったものと同じです。



「障害そのものが無かったものと同じ」とは、未コミットの場合は
当然ロールバックが起こるので、そのトランザクションの実行者に
とっては確実に障害は発生しているわけですが。

DBMSにとっては未コミットのトランザクションは保証対象外なので。
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 2006-08-24 20:06
引用:

バッファだけでなくWALのファイルにも書き出されますよ。
OracleであればREDOログバッファの1/3を使った場合などです。

トランザクション中にWALに書き込む事が可能な理由は、
「コミットの確定 = WALにコミットレコードが存在する」
という条件で判断しているからです。



アドバイスありがとうございます.

ご指摘&以下のURLなどの情報から,
私自身のWALの解釈が間違っている事に気付きました.
具体的には,メモリのバッファ領域に,WALがあると勘違いしておりました.

実際には,データベースへの更新記録は、ディスク領域に有るWALログという
特別なファイルに同期書き込みを使って行われる」事がわかりました.

https://www.thinkit.co.jp/free/marugoto/2/1/12/1.html
1

スキルアップ/キャリアアップ(JOB@IT)