[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 メーリングリストの案内