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

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

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,如果为多事务则为 multixact ID;参见 第 66.1 节
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. 作者 #

石井達夫

提交更正

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