★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

F.28. pgrowlocks

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

デフォルトでは、使用は、スーパーユーザ、pg_stat_scan_tablesロールのメンバ、そのテーブルのSELECT権限を持つユーザに限定されています。

F.28.1. 概要

pgrowlocks(text) returns setof record

パラメータはテーブルの名前です。 結果はレコードの集合となり、各レコードはテーブル内のロックされた1行を示します。 出力列は表 F.20の通りです。

表F.20 pgrowlocksの出力列

名前説明
locked_rowtidロックされた行のタプルID(TID)
lockerxidロックを獲得したトランザクションのトランザクションID、もしマルチトランザクションの場合はmultixact ID
multibooleanロックをマルチトランザクションが獲得していた場合は真
xidsxid[]ロックを獲得しているトランザクションのトランザクションID(マルチトランザクションの場合は複数)
modestext[]ロックを獲得しているトランザクションのロックモード(マルチトランザクションの場合は複数)。Key Share, ShareFor No Key UpdateNo Key UpdateFor UpdateUpdateの配列。
pidsinteger[]ロックを獲得しているバックエンドのプロセスID(マルチトランザクションの場合は複数)

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

  1. テーブル全体が他から排他ロックされている場合、pgrowlocksはブロックされます。

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

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

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

しかし、こうした問い合わせが非常に非効率であることに注意してください。

F.28.2. サンプル出力

=# SELECT * FROM pgrowlocks('t1');
 locked_row | locker | multi | xids  |     modes      |  pids
------------+--------+-------+-------+----------------+--------
 (0,1)      |    609 | f     | {609} | {"For Share"}  | {3161}
 (0,2)      |    609 | f     | {609} | {"For Share"}  | {3161}
 (0,3)      |    607 | f     | {607} | {"For Update"} | {3107}
 (0,4)      |    607 | f     | {607} | {"For Update"} | {3107}
(4 rows)

F.28.3. 作者

Tatsuo Ishii