【PostgreSQL-0007】ロック(Lock)の確認方法とデットロックの解除

ロック(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);

参考サイト