Skip to content

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

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

表 F.21.pgrowlocks输出列

名称类型描述
locked_rowtid锁定行的元组 ID (TID)
lockerxid锁定者的事务 ID,如果是多事务,则为多事务 ID;请参见 第 74.1 节
multi布尔值如果锁定者是多事务,则为 True
xidsxid[]锁定者的事务 ID(如果是多事务,则有多个)
modestext[]锁定者的锁定模式(如果是多事务,则有多个),Key ShareShareFor No Key UpdateNo Key UpdateFor UpdateUpdate 的数组。
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