PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

F.31. pgrowlocks — 显示表的行锁信息 #

F.31.1. 概述
F.31.2. 输出示例
F.31.3. 作者

pgrowlocks 模块提供一个函数,用于显示指定表的行锁信息。

默认情况下,使用权限仅限于超级用户、拥有 pg_stat_scan_tables 角色特权的角色,以及对该表拥有 SELECT 权限的用户。

F.31.1. 概述 #

pgrowlocks(text) returns setof record

参数是表的名称。结果是一组记录,表中每个被锁定的行对应一行。输出列见 Table F.21。

Table F.21. pgrowlocks 输出列

名称类型描述
locked_rowtid被锁定行的元组 ID(TID)
lockerxid加锁者的事务 ID;如果是多重事务则为多重事务 ID;参见 Section 67.1
multiboolean如果加锁者是多重事务则为真
xidsxid[]加锁者的事务 ID(多重事务时多于一个)
modestext[]加锁者的锁模式(多重事务时多于一个),取值为 For Key Share、For Share、For No Key Update、No Key Update、For Update、Update 组成的数组。
pidsinteger[]持锁后端的进程 ID(多重事务时多于一个)

pgrowlocks 对目标表获取 AccessShareLock,并逐行读取以收集行锁信息。对于大表,这种方式速度不快。请注意:

  1. 如果表上被获取了 ACCESS EXCLUSIVE 锁,pgrowlocks 将被阻塞。

  2. pgrowlocks 不保证产生自洽的快照。在它执行期间,新的行锁可能被获取,旧的锁也可能被释放。

pgrowlocks 不显示被锁定行的内容。如果你想同时查看行内容,可以这样做:

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

但请注意,这样的查询效率会非常低。

F.31.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.31.3. 作者 #

Tatsuo Ishii