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