ロック(Lock)の確認方法
システムカタログのpg_locksビューで、処理中のトランザクションによりロックされている情報を確認する事ができます。下記のSELECT文を実行してもらうと、リアルタイムのロック情報が確認できます。
SELECT l.pid,l.granted,d.datname,l.locktype,relation,relation::regclass,transactionid,l.mode
FROM pg_locks l LEFT JOIN pg_database d ON l.database = d.oid
WHERE l.pid != pg_backend_pid()
ORDER BY l.pid;
- l.pid・・・バックエンドプロセスのpid
- l.granted・・・ロックが待たされている場合 f
- d.datname・・・DB名
- l.locktype・・・ロック対象。今回はテーブルレベル'relation'のみ抽出
- relation・・・テーブル等oid
- relation::regclass・・・テーブル等名称(pg_classへ結合の代わりにregclassキャストで名前を取得)
- transactionid・・・トランザクションID
- l.mode・・・ロックモード
- l.pid != pg_backend_pid()・・・このSQL自身のロックは結果から除外
デットロックの解除
Compiere(コンピエール)の頃よりiDempiere(アイデンピエレ)に至るまで、デットロックが発生した経験はありませんが、デットロックの解除方法を参考サイトの情報をもとにメモしておきたいと思います。
プロセスIDの確認
SELECT l.pid, db.datname, c.relname, l.locktype, l.mode
FROM pg_locks l
LEFT JOIN pg_class c ON l.relation=c.relfilenode
LEFT JOIN pg_database db ON l.database = db.oid
ORDER BY l.pid;
※pid がプロセスIDを意味します。
プロセスの停止
SELECT pg_cancel_backend(プロセスID);