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