[pgsql-jp: 31095] 関数によるLOCKの順序

fuku fuku @ linux.myhome.cx
2003年 9月 20日 (土) 16:29:04 JST


はじめまして。fukuと申します。

LOCKが実行される順序について質問させていただきます。

以下のようなテーブルにINSERTする際に、serialnoに自動的に
連番を振りたいと考えています。

  # SELECT * FROM testtable;
   serialno | name
  ----------+------
          1 | test

そこで、以下のような関数を作成しました。

  CREATE FUNCTION get_no() RETURNS INTEGER
  AS 'LOCK TABLE testtable IN SHARE MODE;
      SELECT MAX(serialno)+1 FROM testtable'
  language 'sql';

これを利用して、以下のようなSQLでINSERTを行います。
  # INSERT INTO testtable VALUES(get_no(),'test2');

上記のようなSQLを発行した場合、testtableがLOCKされる順序は、

A、(1)まず、INSERTが獲得するROW EXCLUSIVE MODEでロックされる。
    (2)その後、関数get_no()によってSHARE MODEでロックされる。
B、(1)まず、関数get_no()によってSHARE MODEでロックされる。
    (2)その後、INSERTが獲得するROW EXCLUSIVE MODEでロックされる。

のどちらにかになると思っているのですが、
A、Bどちらになるのでしょうか?

2つのトランザクションから同時に実行された場合、
Bであれば問題ないのですが、
A、の場合はデッドロックが起きる可能性があるかと思っています。


今回、serialnoの値が飛び番になってしまうとマズイので、
sequenceで値を取るのは難しいと考えています。

RedHatLinux9上で
postgresql-7.3.2を利用しています。

よろしくお願いいたします。

-- 
fuku mailto:fuku @ linux.myhome.cx




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