2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

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

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

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

F.31.1. 概述 #

pgrowlocks(text) returns setof record

参数是表的名称。结果是一组记录,对于表中每个被锁定的行,都有一行输出。输出列显示在表 F.21中。

表 F.21. pgrowlocks 输出列

名称 类型 描述
locked_row tid 被锁定行的元组 ID(TID)
locker xid 锁定者的事务 ID,如果是多事务则为 multixact ID;参见第 67.1 节
multi boolean 如果锁定者是多事务,则为 True
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.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

提交更正

如果您在文档中发现任何不正确、与您对特定功能的实际体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。