F.27. pgrowlocks

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

F.27.1. 概述

pgrowlocks(text) returns setof record

该参数是一个表的名字。结果是一组记录,一行代表表中的一个锁定的行。 输出字段在Table F-19中显示。

Table F-19. pgrowlocks 输出字段

名字 类型 描述
locked_row tid 锁定的行的元组 ID (TID)
locker xid 锁定的事务 ID,或如果是多事务则为 multixact ID
multi boolean 如果锁定的是多事务则为真
xids xid[] 锁定的事务 ID(如果有多个事务则为多个)
lock_type text[] 锁定的锁模式 (如果有多个事务则为多个), 一些 Key ShareShareFor No Key UpdateNo Key UpdateFor UpdateUpdate
pids integer[] 锁定后端的过程 ID (如果有多个事务则为多个)

pgrowlocksAccessShareLock作为目标表, 并且一行一行的读取行以采集行锁的信息。这对于大表来说不是非常快。请注意;

  1. 如果表作为一个整体是被他人排他锁的,那么pgrowlocks将被阻塞。

  2. pgrowlocks不保证生成一个自我一致的快照。 在执行期间,获得一个新的行锁或释放一个旧锁都是可能的。

pgrowlocks并不显示锁定的行的内容。 如果你希望同一时间查看行的内容,你可以像下面这样做:

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

不论如何都要小心(自PostgreSQL 8.3起),这样一个查询将会是非常低效率的。

F.27.2. 示例输出

test=# SELECT * FROM pgrowlocks('t1');
 locked_row | lock_type | locker | multi |   xids    |     pids
------------+-----------+--------+-------+-----------+---------------
      (0,1) | Shared    |     19 | t     | {804,805} | {29066,29068}
      (0,2) | Shared    |     19 | t     | {804,805} | {29066,29068}
      (0,3) | Exclusive |    804 | f     | {804}     | {29066}
      (0,4) | Exclusive |    804 | f     | {804}     | {29066}
(4 rows)

F.27.3. 作者

Tatsuo Ishii