著作一覧 |
補償トランザクションの実装はそれなりに難しいわけだが、システム更新番号(あるいはそれに準ずる機能)を利用するのはどうだろうか?
並行処理が行われている時、システム更新番号はすごい勢いで変化していく。たとえば、あるトランザクションの開始時に1000だとして、終了時に1001ということはない。というのは、別のトランザクションが処理している可能性があるからだ。
しかし、そのトランザクションが更新したロウに限定すれば以前の状態を取り出せるはずだ。
実際には、トランザクションの開始時点で取得したとしても、他のトランザクションの更新待ちになる可能性があるわけだから、Oracleに限定すれば、あるロウについて必ず悲観ロックを実行し、それからシステム更新番号を取り出し、そして更新したらどうだろうか。
もし複数のロウを更新するのであれば、最初にすべての対象となるテーブルのロウに対して悲観ロックを実行する。そしてシステム更新番号を取り出し、次にすべてのロウを更新する。
トランザクションの開始時にDAOにロウデータをフィルした状態で用意すればそれなりの単純さで実現できる。
トランザクションのIDとそうやって取得したシステム更新番号をペアで持つ。
と、考えたが、そのトランザクションの処理後に更新されたらだめだ。やはり差分で補償するしか無いのかなぁ。
ジェズイットを見習え |