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