[pgsql-jp: 30197] Re: Serial型の列とトランザクション

Hiroshi Inoue Inoue @ tpf.co.jp
2003年 6月 19日 (木) 13:01:43 JST


井上です。

> こんにちは.
> 坂田@横須賀です.
> 
> サマリ作成ありがとうございます>北村さん
> 
> 北村さん wrote:[pgsql-jp: 30195]
> > とりあえず、欠番なし・同値無し をする時は、単文ではムリ、と
> > いうことで(・・・良いんですよね?汗)
> 
> ここで問題になっているSQL文については,PostgreSQLの
> デフォルト動作の問題もあり,1文では期待した動作をしないものと
> 思います.
> 
> > サマリ
> > [Q] あるカラムで欠番なし・同値無しのセットを以下のような単文
> > で可能か?
> > insert tblA(a) values ((select max(t1.a) + 1 from tblA t1));
> > [A] 値が重複する可能性あり。MVCC により、同時に走ったトラン
> > ザクションからは max() が同値になるため。
> > 欠番なし・同値無しのセットを作るには、
> > BEGIN;
> >  lock table tblA in share row exclusive mode;
> >  insert tblA(a) values ((select max(t1.a) + 1 from tblA t1));
> > COMMIT;
> > で行なう必要あり。
> > (ロックを獲得するモードは SHARE ROW EXCLUSIVE MODE であって
> > ますよね?間違っていたらご指摘おねがい>皆様)
> 
> このテーブルロックですが,同じコードによるトランザクションどうしが
> 同時に実行されなければ良いので,SRX(Share Row eXclusive)以外に,
> 以下のモードでも可能と思います.
> 
> ・Share Update Exclusive (SUX)

これはおすすめできません。concurrent vacuum専用のロックです。
こけおどしの名前をつけずにvacuum lockでも名付ければよかった
のですが。

> ・Exclusive (X)
> ・Access Exclusive (AX)
> 
> また,insert文の実行時には Row Exclusive Lockを取るので,
> これと競合する
> 
> ・Share (S)
> 
> でテーブルをロックしても,有効だと思います.
> (間違っていたら,ご指摘下さい)

これもおすすめできません。デッドロックの原因となります。

Hiroshi Inoue
	http://www.geocities.jp/inocchichichi/psqlodbc/



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