F.28. pgrowlocks
pgrowlocks
模块提供了用于显示指定表的行锁定信息的功能。
默认情况下,使用仅限于超级用户,pg_stat_scan_tables
角色的成员以及对表具有SELECT
权限的用户。
F.28.1. Overview
pgrowlocks(text) returns setof record
该参数是表的名称。结果是一组记录,表中的每个锁定行都有一行。输出列显示在Table F.20中。
表 F.20.pgrowlocks
输出列
Name | Type | Description |
---|---|---|
locked_row | tid | 锁定行的 TuplesID(TID) |
locker | xid | 储物柜的 TransactionID,如果是多 Transaction,则为多重 ID |
multi | boolean | 如果储物柜为多重 Transaction,则为 True |
xids | xid[] | 储物柜的 TransactionID(如果是多笔 Transaction,则为多个) |
modes | text[] | 储物柜的锁定模式(如果是多笔 Transaction,则为多个),即Key Share ,Share ,For No Key Update ,No Key Update ,For Update ,Update 的数组。 |
pids | integer[] | 锁定后端的进程 ID(如果是多事务,则为多个) |
pgrowlocks
用AccessShareLock
作为目标表,并逐行读取每一行以收集行锁定信息。对于一张大桌子来说,这不是很快。注意:
-
如果整个表被其他人排他锁定,则
pgrowlocks
将被阻止。 -
不能保证
pgrowlocks
产生一个自一致的快照。在执行期间,可能会采用新的行锁,或者释放了旧的锁。
pgrowlocks
不显示锁定行的内容。如果要同时查看行内容,可以执行以下操作:
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
WHERE p.locked_row = a.ctid;
但是请注意,这样的查询效率很低。
F.28.2. samples 输出
=# 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. Author
Tatsuo Ishii