PostgreSQLでdeadlock detectedが出るんだけど・続き

追記(2009.12)
結論から言って、LudiaはPostgreSQL8.1はダメです。8.2にしましょう

  • -

昨日の記事Ludia開発日記のludiaさんからコメントいただきました
コメント欄に返信したら長くなったので、改めてエントリーにします

以下

AccessExclusiveLockになるのはおかしいとご回答いただいたので、更新時のロックについて詳しく調べてみました

商品マスタデータベースの[データベース名:database][テーブル名:master]です
商品タイトル[カラム名:title]に対してインデックスを作成しています
更新のクエリはperlスクリプトから送信して、BEGIN 〜 ENDの部分はありません

UPDATE master SET title = 'タイトル' WHERE code = '0001'

上記のようにして、0.01秒の間隔で、whileでループさせ何度も送信します
また、

select (select relname from pg_class c where c.oid = l.relation) as relation,
relation as relation_id,
(select distinct datname from pg_database d where d.oid = l.database) as database,
l.transaction,
l.pid,
l.mode,
l.granted,
(select query_start from pg_stat_activity where procpid = l.pid) as query_start,
substring((select current_query from pg_stat_activity where procpid = l.pid),0,10) as query
from pg_locks l

上記のように、ロック状態を取得するSQLを送信するプログラムを作成して、こちらは0.001秒の間隔で、whileでループさせて結果を出力させました
その結果を見ますと、やはり、UPDATE時にAccessExclusiveLockが働いているようです
ただし、下記のように、おっしゃられるとおりにShareUpdateExclusiveLockも働いている状態が確認できました

idx_ngram_title 2086300 database 2182206029 7622 ShareUpdateExclusiveLock 1 2009-05-01 17:08:06
idx_ngram_title 2086300 database 2182206029 7622 AccessExclusiveLock 1 2009-05-01 17:08:06
index_master_code 17484 database 2182206029 7622 AccessShareLock 1 2009-05-01 17:08:06
index_master_code 17484 database 2182206029 7622 RowExclusiveLock 1 2009-05-01 17:08:06
index_master_code2 17483 database 2182206029 7622 RowExclusiveLock 1 2009-05-01 17:08:06
2182206029 7622 ExclusiveLock 1 2009-05-01 17:08:06
index_master_code3 17482 database 2182206029 7622 RowExclusiveLock 1 2009-05-01 17:08:06
master_pkey 17386 database 2182206029 7622 RowExclusiveLock 1 2009-05-01 17:08:06
master 17143 database 2182206029 7622 AccessShareLock 1 2009-05-01 17:08:06
master 17143 database 2182206029 7622 RowExclusiveLock 1 2009-05-01 17:08:06

Ludiaのプログラムも確認させていただいて、

LockAcquire(&locktag, ShareUpdateExclusiveLock, 0, 0);

と書いてあるのを見つけて、確かにShareUpdateExclusiveLockなんだろうなと思うのですけど、AccessExclusiveLockにもなってしまっている状況です

確認したPostgreSQLのバージョンは8.1.11で、最新のものにバージョンアップをしていない上に、現在利用しているデータベースは、前に/var/lib/pgsql/data配下に存在したデータベースから別のディレクトリで新しくinitdbしてから丸ごとリストアしたもので、そういう普段と違う状態かもしれないデータベースなので、「中古車を買って乗ってるんだから故障してもしょうがないじゃん」みたいな気持ちでもあります
リストしてからdead lockに陥りやすくなった気がしたので、一度VACUUM FULLもしてみたのですが、解消されませんでした
多分、こちら側の環境が悪いと思うので、もう少し頑張ってみます(`・ω・´)