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

Ebihara, Yuichiro Yuichiro.Ebihara @ jp.sony.com
2004年 1月 27日 (火) 22:09:31 JST


こんにちは、海老原です。

> > おそらく仕様上の動きなのでしょうが、
> 
> DBMSのあるべき仕様であり、状態に応じた処理をしたいのであれば、仕様を理
> 解した上で自分で回避方法をたてるのが正しいかと思います。

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

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

残念ながらPostgreSQLにはSAVEPOINTはないものの、それにしてもエラー即
トランザクション全体のロールバックというのは、私も不便に思いますし、
これが本当にあるべき仕様なのかという点については疑問に思います。

もしトランザクションを継続できれば、例えば自分でINSERTしたレコードに
対してDELETEを発行することにより擬似的にSAVEPOINTまでのROLLBACKを
実現することもできるわけですし。

> ・UNIQUE KEYを設定したカラム a がある
> ・カラム a に値を設定したい。
>   −新規値なら挿入
>   −既存値なら更新
> 
> とかしたいだけではないのですか?
> 
> それなら事前に検索(SELECT)して値の有無を確認して挿入/更新すれば良いの
> ではないでしょうか?(それか更新して更新結果が0なら挿入するとか)

まあ、たぶんこれが一番ありがちなパターンでしょうし、この場合には
その回避策がとれるんですけどね・・・。
そうもいかないケースはあるんじゃないかと思います。

--
海老原 雄一郎 / EBIHARA Yuichiro
E-mail: Yuichiro.Ebihara @ jp.sony.com



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