バッファ管理。チェックポイント

チェックポイントでLSNを参照するか?

バッファ管理。タプルの追加。宿題への回答でLSNを調べたときに、LSNがチェックポイントのときにも参照されるかどうか未確認と書いたけど、参照されていた。
チェックポイントで、ダーティーなページをフラッシュする前にWALバッファをフラッシュしようとするが、これからフラッシュしようとしているページに対応するログがすでにフラッシュ済みかどうかをページのLSNを用いてチェックしている(ページのLSNがWALログの最後のレコードのLSNと同じか小さければすでにWALログに書き込まれているということ)。

チェックポイントで将来的にロールバックされる変更はディスクに書かれるのか?

こういうときはどうなるんだろう?あるプロセス(P1)がトランザクションを開始し、INSERTを行い、その後ロールバックする。定期的に実行されるチェックポイントのプロセス(P2)がちょうどP1のロールバックの前で実行されるとする。図にするとこんなかんじ。

P1:BEGIN
P1:INSERT    …ページXにタプルを追加。WALバッファにログレコードを追加。

P2:CHECKPOINT …ページXとWALバッファをフラッシュ。

P1:ROLLBACK

CHECKPOINTの処理で将来的にロールバックされる変更がディスクに記録されてしまうとしたら、この変更は他のトランザクションからは見えてはいけない。他のトランザクションが読もうとしてもMVCCの可視性チェックではじかれる?まてよ、メモリ上のページにも書かれるわけだからディスクに書かれるかどうかはあまり関係ない。フラッシュされようとされまいと他のトランザクションからは見えてはいけない。
リカバリ。WAL(Write Ahead Log)でMVCCの可視性チェックでなぜCLOGをチェックしているのかわからなかったが、コミットされたトランザクションなのかどうかを確認するためにCLOGを使っているのかもしれない。

  • 確認したいことは2つ。
    • CHECKPOINTの処理でトランザクションが未確定の変更がフラッシュされるのか?
    • ロールバックされるデータがディスクや共有バッファ上のページに記録されるとしたらその可視性はどのように禁止されるのか?