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

Tetsuo SAKATA sakata.tetsuo @ lab.ntt.co.jp
2003年 6月 19日 (木) 15:25:40 JST


こんにちは.
坂田@横須賀です.

ご指摘ありがとうございます>井上さん

井上さん wrote:[pgsql-jp: 30197]
> > > サマリ
> > > [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でも名付ければよかった
> のですが。

このモードは vacuum コマンド「専用」なのですね.
その点は,了解しました.

疑問として残っているのは,
vacuumコマンド以外の通常のAPが,このロックモードを利用した場合,
具体的に何か問題が生じるのか,という点です.
concurrent vacuumが動作できなくなるのはわかるのですが,
それ以外に何かあるのでしょうか?

> > また,insert文の実行時には Row Exclusive Lockを取るので,
> > これと競合する
> >
> > ・Share (S)
> >
> > でテーブルをロックしても,有効だと思います.
> > (間違っていたら,ご指摘下さい)
> 
> これもおすすめできません。デッドロックの原因となります。

この点はご指摘どおりです.
先に投稿した時には,ここまで考えが及んでいませんでした.

結局,北村さんが投稿されたサマリ([pgsql-jp: 30195])で
書かれていた方法でOKということですね.

-- 
Tetsuo SAKATA, Yokosuka JAPAN.



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