F.28. pgrowlocks

pgrowlocks模块提供了用于显示指定表的行锁定信息的功能。

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

F.28.1. Overview

pgrowlocks(text) returns setof record

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

表 F.20.pgrowlocks输出列

NameTypeDescription
locked_rowtid锁定行的 TuplesID(TID)
lockerxid储物柜的 TransactionID,如果是多 Transaction,则为多重 ID
multiboolean如果储物柜为多重 Transaction,则为 True
xidsxid[]储物柜的 TransactionID(如果是多笔 Transaction,则为多个)
modestext[]储物柜的锁定模式(如果是多笔 Transaction,则为多个),即Key ShareShareFor No Key UpdateNo Key UpdateFor UpdateUpdate的数组。
pidsinteger[]锁定后端的进程 ID(如果是多事务,则为多个)

pgrowlocksAccessShareLock作为目标表,并逐行读取每一行以收集行锁定信息。对于一张大桌子来说,这不是很快。注意:

  • 如果整个表被其他人排他锁定,则pgrowlocks将被阻止。

  • 不能保证pgrowlocks产生一个自一致的快照。在执行期间,可能会采用新的行锁,或者释放了旧的锁。

pgrowlocks不显示锁定行的内容。如果要同时查看行内容,可以执行以下操作:

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

但是请注意,这样的查询效率很低。

F.28.2. samples 输出

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

Tatsuo Ishii