[pgsql-jp: 32142] Re: トランザクション中に ERRORが発生するとABORT する

Takao Kato sirius @ jp.fujitsu.com
2004年 1月 28日 (水) 10:33:27 JST


加藤@川崎です。

> ANSI/ISO SQLにSAVEPOINTというのがあるじゃないですか?

ありますねぇ。CHECKPOINTだかSAVEPOINTだかどっちか忘れてしまいますが。
でも、すでに石井さんも書かれていますが、POINTをスタック出来ませんからね > PostgreSQL
# PostgreSQLのCHECKPOINTは独自拡張ですね。

> あれって何らかのエラー(SQL以外のエラーもあるんだろうけど、主にSQL)が
> 発生したときに途中までロールバックして、別の処理をやって何とかコミット
> まで持っていく、という用途を想定しているんじゃないかと思います。

SAVEPOINTまでのROLLBACK(Undo)とROLLFORWARD(Redo)を使えば、大きなトラン
ザクションの中に入れ子トランザクション(各々の処理が矛盾なく排他で動く)
があった場合には有効ですが、今回のように「つっ走る」だけの単一トランザ
クションタイプでは有効に働かないような気がします。仮に入れ子可能であっ
た場合ですが、

   ▼--------- 一塊のトランザクション ---------▼
     ▼---- 処理A ----▼
       ▼---- 処理B ---------▼
            ▼-- 処理C --▼
                  ▼--------- 処理D ---------▼
                          △SAVEPOINT
                               ×異常発生

処理A〜Dそれぞれ*書き込み*があると仮定しますと、SAVEPOINTまでに完了し
ている入れ子トランザクションはAとB。途中はCとDです。で、異常発生時には
DBMSによって、A/Cは処理完了=ROLLFORWARDの対象ですが、B/Dは処理未完了で
すのでROLLBACKされます。すると、つっ走る(=処理Dの残りを処理)だけでは矛
盾は取り戻せませんから。(DBMSで取り戻してもらってもプログラムで矛盾を
作る結果になりますから)


例えば、つっ走るのではなくプログラム上で入れ子トランザクションの状態を
監視し、SAVEPOINT時点で完遂していない入れ子に限っては全てのクエリを(自
分で)保存しておいて異常発生時点で処理を取り戻すことができるか、あるい
は、DBMSが管理するROLLBACKのログを参照できればなんとかなるかもしれませ
んけれど。ただし、プログラムで対処できる余地が残っているので玉置さん的
にはOKかも。


残念なことに今回の場合ないものねだりですが。他のDBMSだとどうなんだろう?
# 時間が出来たらちょっと調べてみよ。(忘れそうですが)


なんか間違ったこと書いていたら激しく突っ込んでやってください。 _o_ >識者の皆様
# そもそもフラットトランザクションだから、こんな風に動かないような気も
# するなぁ.....


と、ここまで書いた後で海老原さん/玉置さんのメールを読み直していると、
このメールを読まれた瞬間「そんなことわかってるわぃ」と突っ込む姿が ^^;;
-------------------------------------------------------------
加藤%昔の記憶で物事書くとろくなことは無いと思うけれど、、、



pgsql-jp メーリングリストの案内