[pgsql-jp: 32125] Re: トランザクション中に ERRORが発生するとABORT する
Takao Kato
sirius @ jp.fujitsu.com
2004年 1月 27日 (火) 09:51:47 JST
加藤@川崎です。
> それは、表題の通りなのですが、トランザクション中にSQLにエラーがあると
> その時掛かっていたトランザクションがアボートしてしまい、それ以降トラ
> ンザクションを終了させるまで、SQLを受け付けなくなってしまいます。
え〜と、トランザクション処理なのですから、それが普通じゃないですか??
# 実はサブジェクトを拝見した時、トランザクション処理中にErrorが発生す
# るとPostgreSQLが落ちる!? のかと思ってしまいました ^^;;
DBMSのトランザクション処理は、一連の処理が矛盾をきたすことなく、正しく
終了するための処理であり、矛盾には他者からの操作(参照/挿入/更新/削除)
からデータを保護する役目もありますが、一連の処理=自分自身の操作に対し
ても保護がかからないと意味がありません。誤ったまま処理を続けても矛盾が
広がるだけなのですから。例えば、カラム制約条件をつける場合など、トラン
ザクション(=一連の処理)の順序性を考えないと自身の処理中であっても矛盾
が発生する事はあります。
そんなわけで、
> おそらく仕様上の動きなのでしょうが、
DBMSのあるべき仕様であり、状態に応じた処理をしたいのであれば、仕様を理
解した上で自分で回避方法をたてるのが正しいかと思います。
一人で利用しているDBならBEGINと宣言しなければERRORが起ころうがなにしよ
うが、叩いたコマンドは(権限の有無に左右されるものの)全て実行されます。
で、そもそもの問題がトランザクションがどうのじゃなくて、
> 「insertして見て例外が発生するようならupdateに切り替える」とか、
> 「一括insert中に予期せぬエラーが発生したレ>コードをログに吐いて無視> する」
> などの処理が出来ないので不便だな。と思いました。
と書いていることから想像するに、
・UNIQUE KEYを設定したカラム a がある
・カラム a に値を設定したい。
−新規値なら挿入
−既存値なら更新
とかしたいだけではないのですか?
それなら事前に検索(SELECT)して値の有無を確認して挿入/更新すれば良いの
ではないでしょうか?(それか更新して更新結果が0なら挿入するとか)
では
-------------------------------------------------------------
加藤@川崎
pgsql-jp メーリングリストの案内