The <filename>pgrowlocks</filename> module provides a function to show row
locking information for a specified table.
pgrowlocks
モジュールは、指定したテーブルにおける行ロックの情報を示す関数を提供します。
By default use is restricted to superusers, roles with privileges of the
<literal>pg_stat_scan_tables</literal> role, and users with
<literal>SELECT</literal> permissions on the table.
デフォルトでは、使用は、スーパーユーザ、pg_stat_scan_tables
権限を持つロール、そのテーブルのSELECT
権限を持つユーザに限定されています。
pgrowlocks(text) returns setof record
The parameter is the name of a table. The result is a set of records, with one row for each locked row within the table. The output columns are shown in <xref linkend="pgrowlocks-columns"/>. パラメータはテーブルの名前です。 結果はレコードの集合となり、各レコードはテーブル内のロックされた1行を示します。 出力列は表 F.20の通りです。
表F.20 pgrowlocks
の出力列
名前 | 型 | 説明 |
---|---|---|
locked_row | tid | ロックされた行のタプルID(TID) |
locker | xid | ロックを獲得したトランザクションのトランザクションID、もしマルチトランザクションの場合はマルチトランザクションID。66.1を参照 |
multi | boolean | ロックをマルチトランザクションが獲得していた場合は真 |
xids | xid[] | ロックを獲得しているトランザクションのトランザクションID(マルチトランザクションの場合は複数) |
modes | text[] | ロックを獲得しているトランザクションのロックモード(マルチトランザクションの場合は複数)。For Key Share 、For Share 、For No Key Update 、No Key Update 、For Update 、Update の配列。 |
pids | integer[] | ロックを獲得しているバックエンドのプロセスID(マルチトランザクションの場合は複数) |
<function>pgrowlocks</function> takes <literal>AccessShareLock</literal> for the
target table and reads each row one by one to collect the row locking
information. This is not very speedy for a large table. Note that:
pgrowlocks
は対象テーブルに対してAccessShareLock
を獲得し、ロック情報の収集のために1行ずつ行を読み取ります。
これは大規模テーブルにおいては高速とは言えません。
以下に注意してください:
If an <literal>ACCESS EXCLUSIVE</literal> lock is taken on the table,
<function>pgrowlocks</function> will be blocked.
テーブルでACCESS EXCLUSIVE
ロックが獲得されている場合、pgrowlocks
はブロックされます。
<function>pgrowlocks</function> is not guaranteed to produce a
self-consistent snapshot. It is possible that a new row lock is taken,
or an old lock is freed, during its execution.
pgrowlocks
では、自己矛盾のないスナップショットを生成することは保証されません。
その実行中に、新しい行ロックが獲得されることも、古いロックが解放されることもあり得ます。
<function>pgrowlocks</function> does not show the contents of locked
rows. If you want to take a look at the row contents at the same time, you
could do something like this:
pgrowlocks
は、ロックされた行の内容は表示しません。
同時に行の内容を参照したい場合には、以下のようにして実現することができます:
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p WHERE p.locked_row = a.ctid;
Be aware however that such a query will be very inefficient. しかし、こうした問い合わせが非常に非効率であることに注意してください。
=# 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)