[pgsql-jp: 35079] Re: ロックについて
Hideaki Fuzisawa
fhideaki @ pk.highway.ne.jp
2005年 3月 21日 (月) 21:40:27 JST
藤沢です。
>1.テーブルA,B,Cの最大IDを取得する
>2.1の最大IDが全て同じ場合MAX+1をプログラムで作成
>3.A.B.CテーブルにMAX+1のIDでデータをInsertする
>4.正常にInsertできたらcommitする。
ACCESS EXCLUSIVEであればできそうですがパフォーマンス上これを連発するのは
どうなんでしょうね。
http://www.postgresql.jp/document/pg746doc/html/explicit-locking.html
にロックモードの詳細があります。
もう一つの手段はテーブルA,B,Cの最大IDのみを格納する別テーブルを定義して
そこからSELECT FOR UPDATEを使って現在の最大値を取得し上記4まで終了
した後にこのテーブルを更新してやるというのはどうでしょう。
でも、SELECT FOR UPDATEで参照をブロックすることはできないので結局
ACCESS EXCLUSIVEロックをかけることになりそうですね。。
*1.テーブルA,B,Cの最大IDを取得する→最大値のみを格納するテーブルより取得する
(このテーブルにACCESS EXCLUSIVE)
2.1の最大IDが全て同じ場合MAX+1をプログラムで作成
3.A.B.CテーブルにMAX+1のIDでデータをInsertする
*4.正常にInsertできたらcommitする→最大値のみを格納するテーブルを更新し
commit
もし上記A,B,Cのテーブルが頻繁に利用される類の物であればこれのほうが
パフォーマンスいいかもしれません。
pgsql-jp メーリングリストの案内