Transaction Management (1)

CS 4611 Home Pageを見て、勉強してみる。特に、Transaction Management。まずは、http://www.d.umn.edu/~rmaclin/cs4611/notes/Ch16_Overview_Xacts.pdfから。

  • トランザクションとは?
    • そもそも、DBMSでのボトルネックはディスクへのアクセス。だから、複数のユーザがいたら並列に実行することで、CPUの能力を遺憾なく発揮する。
    • アプリケーションは、さまざまな命令を行う。DBMSが興味あるのは、情報を入力・出力するところだけ。
    • DBMSが抽象化しているのは、ユーザにとって、データの入力・出力が直列化されていること(直列化っていうのは、ACIDで表現されていて、他人がどうあれ、自分のやりたいことができるというような意味です。自分のやりたいことが他人に邪魔されないということですね)。
  • アトミック性
    • 全ての処理が終われば、commitして良い。途中でabortすることもできる。
    • アトミック性とは、トランザクザクションは全てのアクションが成功するか、全てのアクションが失敗するかのどちらかとなる。トランザクションは更新の最小単位。
    • このようなことをできるようにするために、undoログがある。
  • スケジューリング
    • 逐次スケジュールとは、トランザクションが順番に実行されるようなスケジュール。
    • スケジュールの等しさは、スケジュールの結果が等しいことによる。
    • リアライザブルなスケジュールとは、トランザクションを順番に実行したスケジュールと等価。
  • 2相ロック
    • 読み込みに関しては、Shared Lock。書き込みに関しては、Exclusive Lock。を取得する。
    • この時、一度確保したロックは、トランザクションが終了するまで解放しない。
    • この手法では、シリアライザブルなスケジュールにのみ対応する。
  • アボート
    • もし、トランザクションTiがアボートしたときに、Tiの書き込んだデータをTjが読み込んでいたばあい、Tjもアボートする。
    • 通常、このようなアボートを避けるためにトランザクションが一度つかんだロックは、コミット時にのみ解放する。
    • アボートしたトランザクションをもとに戻すために、undoログを全ての書き込みに対して保持しておく。このログは、システムがクラッシュしたときに実行中だったトランザクションをもとに戻すのにも利用される。
  • ログ
    • Tiが書き込みを行うときには、新しいデータと古いデータ両方をログに書き込む。この書き込みは、ページへの書き込み前に完了する必要がある。
    • Tiがcommit/abortしたときに、それらを意味するレコードを記述する。
  • リカバリ
    • 分析:ログを前向きに走査する。最近のチェックポイントよりも新しいレコードを読み込んで、実行中のトランザクション、つまりバッファプールのページを汚したままクラッシュしたトランザクションを探す。
    • redo:必要に応じて、バッファプールにあるダーティページへの更新を全て再実行する。全てのログに書かれた更新を実行し、ディスクへ書きこむ。
    • undo:クラッシュの時点で、まだ実行中だったトランザクションについての更新は、古いデータを使ってもとに戻す。ログを後ろ向きに走査する。

ログは、まずチェックポイントファイルの作成時刻よりもあとに書かれたレコードを読んでいって、commitされているなら、もう一度データベースファイルへの書き込みを行う。一度最後まで読み込んだから、今度は逆方向に読み込みをかけていって、commitされていないレコードのundoを行うという感じかな。ちょっと、undoレコードは新しい方から適用させる必要がありそうだけど、なんでだろ。Wnをトランザクションnによる書き込みとして、Cnをトランザクションnのコミットとしてみる。W1(A)->C1->W2(A')->C2->W3(A'')というのがあったとする。すると

transaction undo redo
W1 nothing A
W2 A A'
W3 A' A''

この時、リカバリされた後は、A'となるべき。ただ、W3(A'')により、pageが書き換えられているなら、前の方から読んだA'によるundoが必要。たしかに、最新の書き込みのほうから、逆方向へ読んでいかないとundoできなさそうだ。勝手に意訳したけど、commitしていないredoログも一度実行してしまうのかな。そうすると、commitされてない更新も一度バッファプールに書き込まれるので。