Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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

F.29.1. 概述
F.29.2. 样例输出
F.29.3. 作者

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

默认情况下,仅限超级用户、具有 pg_stat_scan_tables 角色权限的角色和具有对表 SELECT 权限的用户可以使用。

F.29.1. 概述 #

pgrowlocks(text) returns setof record

参数是表的名称。结果是一组记录,表内每一行锁定对应一行。输出列显示在 表 F.20 中。

表 F.20. pgrowlocks 输出列

名称 类型 说明
locked_row tid 已锁定行的元组 ID (TID)
locker xid 锁持有者的事务 ID,如果是多事务,则是多重事务 ID;请参见 第 66.1 节
multi 布尔值 如果是多事务,则为 True
xids xids[] 锁持有者的事务 ID(如果是多事务,有多个)
modes text[] 锁持有者的锁定模式(如果是多事务,则不止一个),数组中的值有 For Key ShareFor ShareFor No Key UpdateNo Key UpdateFor UpdateUpdate
pids integer[] 锁定后端进程的 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.29.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.29.3. 作者 #

Tatsuo Ishii