Transaction Management (1)
CS 4611 Home Pageを見て、勉強してみる。特に、Transaction Management。まずは、http://www.d.umn.edu/~rmaclin/cs4611/notes/Ch16_Overview_Xacts.pdfから。
- トランザクションとは?
- アトミック性
- 全ての処理が終われば、commitして良い。途中でabortすることもできる。
- アトミック性とは、トランザクザクションは全てのアクションが成功するか、全てのアクションが失敗するかのどちらかとなる。トランザクションは更新の最小単位。
- このようなことをできるようにするために、undoログがある。
- スケジューリング
- 2相ロック
- アボート
- ログ
- Tiが書き込みを行うときには、新しいデータと古いデータ両方をログに書き込む。この書き込みは、ページへの書き込み前に完了する必要がある。
- Tiがcommit/abortしたときに、それらを意味するレコードを記述する。
ログは、まずチェックポイントファイルの作成時刻よりもあとに書かれたレコードを読んでいって、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されてない更新も一度バッファプールに書き込まれるので。