Postgresql 中文操作指南

F.31. pgrowlocks — show a table’s row locking information #

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

默认情况下,仅超级用户、具有 pg_stat_scan_tables 角色特权的角色以及对表具有 SELECT 权限的用户可以使用。

F.31.1. Overview #

pgrowlocks(text) returns setof record

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

Table F.21. pgrowlocks Output Columns

Name

Type

Description

locked_row

tid

已锁定行的元组 ID (TID)

locker

xid

锁定者的事务 ID 或多重事务的 multixact ID;请参阅 Section 74.1

multi

boolean

对于多事务锁柜,为真

xids

xid[]

锁柜的事务 ID(如果为多事务,将有多个)

modes

text[]

锁柜的锁定模式(如果为多事务,将有多个), Key ShareShareFor No Key UpdateNo Key UpdateFor UpdateUpdate 数组。

pids

integer[]

锁定后端的进程 ID(如果为多事务,将有多个)

pgrowlocks 将目标表的 AccessShareLock 作为参数,并逐一读取每行以收集行锁定信息。对于一张大表而言,这不是很快的方法。请注意:

pgrowlocks 不会显示锁定行的内容。如果您想要同时查看行内容,可以像这样操作:

SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
  WHERE p.locked_row = a.ctid;

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

F.31.2. Sample Output #

=# 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. Author #

Tatsuo Ishii