[pgsql-jp: 37973] デッドロックの原因調査方法につきまして

Arimura Satoshi sarimur1 @ gw.nsw.co.jp
2007年 2月 2日 (金) 10:40:37 JST


有村と申します。

Postgresのバージョンは 7.4.7です。

下記環境で発生したデッドロック処理について質問があります。

Webのアプリケーションでデータ表示に利用しているテーブルAがあります。
Aテーブルをバッチ処理で30分おきに更新するように設定しています。

Aテーブルを更新するために、3つのテーブルを利用しています。
	・Aテーブル(本テーブル)
	・Bテーブル(本テーブルから変更される削除用ワークテーブル)
	・Cテーブル(本テーブルに変更されるワークテーブル。事前に作成される)

バッチで実行するSQLは以下の内容です。
-----
BEGIN;
ALTER TABLE A RENAME TO B;
ALTER TABLE C RENAME TO A;
COMMIT;

BEGIN;
DROP TABLE C;
COMMIT;
-----
上記バッチ処理で、AテーブルはフロントのWeb側から常に参照できるようにと
考えておりました。
しかし、DROP TABLE C を実行をした際にデッドロック処理が
不定期に発生いたしました。下記がログ内容です。

-----
BEGIN
DROP TABLE
psql:batch.sql:6: ERROR:  deadlock detected
DETAIL:  Process 12617 waits for AccessExclusiveLock on relation 44193321 of database 17143; blocked by process 12579.
Process 12579 waits for AccessShareLock on relation 44193324 of database 17143; blocked by process 12617.
-----

オブジェクトを調べましたところ、44193321はCテーブル、
44193324はpg_toast_44193321ということがわかりました。

デッドロックがおきた原因を調べたいのですが、方法はございますでしょうか。

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
From: 有村 聡 (sarimur1 @ gw.nsw.co.jp)




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