受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

F.29. pgrowlocks #

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

默认情况下,只有超级用户、被授予 pg_stat_scan_tables 角色权限的角色,以及对该表具有 SELECT 权限的用户才能使用它。

F.29.1. 概述 #

pgrowlocks(text) 返回 setof record

参数为表名。结果是一个记录集合,其中表中每个被锁定的行对应结果中的一行。输出列见 Table F.18

Table F.18. pgrowlocks 输出列

名称 类型 描述
locked_row tid 被锁定行的元组 ID(TID)
locker xid 持锁者的事务 ID;若为多事务,则为多事务 ID
multi boolean 如果持锁者为多事务,则为真
xids xid[] 持锁者的事务 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

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。