K.37. ltrowlocks

K.37.1. 概述
K.37.2. 示例输出

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

默认情况下,使用仅限于超级用户、pg_stat_scan_tables角色的成员以及具有表上SELECT权限的用户。

K.37.1. 概述

    pgrowlocks(text) 返回记录集
  

参数是表的名称。结果是记录集,每个表中锁定的行对应一行记录。输出列在 Table K.50中显示。

Table K.50. pgrowlocks 输出列

名称类型描述
locked_rowtid被锁定行的元组 ID(TID)
lockerxid锁定者的事务 ID,如果是多事务,则为多事务 ID
multiboolean如果锁定者是多事务,则为 True
xidsxid[]锁定者的事务 ID(如果是多事务,则可能有多个)
modestext[]锁定者的锁定模式(如果是多事务,则可能有多个), 一个由 Key Share, Share, For No Key Update, No Key Update, For Update, Update 组成的数组。
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;

但是请注意,这样的查询非常低效。

K.37.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)