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

Tietew tietew @ tietew.net
2004年 1月 28日 (水) 14:09:25 JST


On Wed, 28 Jan 2004 13:48:50 +0900
In article <20040128133941.E221.TIETEW @ tietew.net>
[[pgsql-jp: 32147] Re: トランザクション中に ERRORが発生するとABORT する]
Tietew <tietew @ tietew.net> wrote:

> その代わり(?) LOCK TABLE 〜 IN EXCLUSIVE MODE; を使うと他のセッ
> ションからの更新を禁止しつつ MVCC のお陰で読み込みはブロックしな
> いので,それをうまく使うということになるでしょう。
> 
> nested transaction が使えたからといって,SERIALIZABLE 分離レベル
> だと COMMIT でエラーになる可能性もあるので…

引き合いに出された UNIQUE KEY の更新問題を考えてみました。

BEGIN;
  INSERT INTO ATABLE 〜 ;
  IF ERROR THEN
    UPDATE ATABLE 〜 ;
  END IF;
COMMIT;

という処理(擬似コードです)があった場合,これが同時実行されると,
UPDATE でエラーかまたは COMMIT でエラー(シリアライズ矛盾検出)
が起こります。COMMIT でエラーになった場合,トランザクションを再
実行しなければなりません。

対して PostgreSQL では,

BEGIN;
  LOCK TABLE ATABLE IN EXCLUSIVE MODE;
  SELECT 〜 FROM ATABLE 〜 ;
  IF FOUND THEN
    UPDATE ATABLE 〜 ;
  ELSE
    INSERT INTO 〜 ;
  END IF;
COMMIT;

という処理を行うことでデフォルトの READ COMMITTED 分離レベルであっ
ても正しくトランザクションを処理でき,更に COMMIT でエラーになる
こともありません。(その替わり,デッドロックを起こさないように注
意深く LOCK しなければなりませんが)

私は後者のほうが嬉しいです。


―[ Tietew ]――――――――――――――――――――――――――――
Mail: tietew @ tietew.net / tietew @ raug.net
Web : http://www.tietew.net/     Tietew Windows Lab.
PGP fingerprint: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA




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