F.22. pgrowlocks

pgrowlocksモジュールは指定したテーブルに関する行ロックの情報を示す関数を提供します。

F.22.1. 概要

pgrowlocks(text) returns setof record
  

パラメータはテーブルの名前です。 結果は、テーブル内のロックされた行毎に1行のレコードの集合です。 出力列は以下の通りです。

表 F-25. pgrowlocksの出力列

名前説明
locked_rowtidロックされた行のタプルID(TID)
lock_typetext共有ロックの場合Shared、排他ロックの場合Exclusive
lockerxidロックを獲得したトランザクションのトランザクションID、もし複数トランザクションの場合はmultixact ID
multibooleanロックを複数トランザクションで獲得していた場合真
xidsxid[]ロックを獲得したトランザクションのトランザクションID(複数トランザクションの場合は複数)
pidsinteger[]ロックしているバックエンドのプロセスID(複数トランザクションの場合は複数)

pgrowlocksは対象テーブルに対しAccessShareLockを獲得し、1行1行、行を読み取り、行ロックの情報を収集します。 これは大規模テーブルでは高速ではありません。 以下に注意してください。

  1. 他者がテーブル全体を排他ロックしていた場合、pgrowlocksはブロックされます。

  2. pgrowlocksでは、自身で一貫したスナップショットを生成することは保証されません。 実行中に、新しい行ロックが獲得されることも、古いロックが解放されることもあり得ます。

pgrowlocksはロックされた行の内容を示しません。 同時に行の内容を参照したい場合は、以下のようにして行うことができます。

SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
  WHERE p.locked_row = a.ctid;
  

しかし(PostgreSQL 8.3の時点では)こうした問い合わせが非常に非効率的であることに注意してください。

F.22.2. サンプル出力

test=# SELECT * FROM pgrowlocks('t1');
 locked_row | lock_type | locker | multi |   xids    |     pids
------------+-----------+--------+-------+-----------+---------------
      (0,1) | Shared    |     19 | t     | {804,805} | {29066,29068}
      (0,2) | Shared    |     19 | t     | {804,805} | {29066,29068}
      (0,3) | Exclusive |    804 | f     | {804}     | {29066}
      (0,4) | Exclusive |    804 | f     | {804}     | {29066}
(4 rows)
  

F.22.3. 作者

Tatsuo Ishii

アダルトレンタルサーバー