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