[pgsql-jp: 30196] Serial型の列とトランザクション
Tetsuo SAKATA
sakata.tetsuo @ lab.ntt.co.jp
2003年 6月 19日 (木) 09:30:04 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)
・Exclusive (X)
・Access Exclusive (AX)
また,insert文の実行時には Row Exclusive Lockを取るので,
これと競合する
・Share (S)
でテーブルをロックしても,有効だと思います.
(間違っていたら,ご指摘下さい)
--
Tetsuo SAKATA, Yokosuka JAPAN.
pgsql-jp メーリングリストの案内