pgrowlocksモジュールは指定したテーブルに関する行ロックの情報を示す関数を提供します。
pgrowlocks(text) returns setof record
パラメータはテーブルの名前です。 結果は、テーブル内のロックされた行毎に1行のレコードの集合です。 出力列は表F-22の通りです。
表 F-22. pgrowlocksの出力列
| 名前 | 型 | 説明 |
|---|---|---|
| locked_row | tid | ロックされた行のタプルID(TID) |
| lock_type | text | 共有ロックの場合Shared、排他ロックの場合Exclusive |
| locker | xid | ロックを獲得したトランザクションのトランザクションID、もし複数トランザクションの場合はmultixact ID |
| multi | boolean | ロックを複数トランザクションで獲得していた場合真 |
| xids | xid[] | ロックを獲得したトランザクションのトランザクションID(複数トランザクションの場合は複数) |
| pids | integer[] | ロックしているバックエンドのプロセスID(複数トランザクションの場合は複数) |
pgrowlocksは対象テーブルに対しAccessShareLockを獲得し、ロックの情報収集のため1行ずつ行を読み取ります。
これは大規模テーブルでは高速ではありません。
以下に注意してください。
他者がテーブル全体を排他ロックしていた場合、pgrowlocksはブロックされます。
pgrowlocksでは、自己矛盾のないスナップショットを生成することは保証されません。
実行中に、新しい行ロックが獲得されることも、古いロックが解放されることもあり得ます。
pgrowlocksはロックされた行の内容を示しません。
同時に行の内容を参照したい場合は、以下のようにして行うことができます。
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
WHERE p.locked_row = a.ctid;
しかし(PostgreSQL 8.3の時点では)こうした問い合わせが非常に非効率的であることに注意してください。
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)
石井 達夫