| PostgreSQL 9.3.1 中文手册 | ||||
|---|---|---|---|---|
| 上一页 | 上一级 | 附录 F. 额外提供的模块 | 下一页 | |
pgrowlocks模块提供一个显示指定的表的行锁定信息的函数。
pgrowlocks(text) returns setof record
该参数是一个表的名字。结果是一组记录,一行代表表中的一个锁定的行。 输出字段在表 F-19中显示。
表 F-19. pgrowlocks 输出字段
| 名字 | 类型 | 描述 | 
|---|---|---|
| locked_row | tid | 锁定的行的元组 ID (TID) | 
| locker | xid | 锁定的事务 ID,或如果是多事务则为 multixact ID | 
| multi | boolean | 如果锁定的是多事务则为真 | 
| xids | xid[] | 锁定的事务 ID(如果有多个事务则为多个) | 
| lock_type | text[] | 锁定的锁模式 (如果有多个事务则为多个), 一些 Key Share, Share, For No Key Update, No Key Update, For Update, Update。 | 
| pids | integer[] | 锁定后端的过程 ID (如果有多个事务则为多个) | 
pgrowlocks将AccessShareLock作为目标表,
并且一行一行的读取行以采集行锁的信息。这对于大表来说不是非常快。请注意;
如果表作为一个整体是被他人排他锁的,那么pgrowlocks将被阻塞。
pgrowlocks不保证生成一个自我一致的快照。
在执行期间,获得一个新的行锁或释放一个旧锁都是可能的。
 pgrowlocks并不显示锁定的行的内容。
如果你希望同一时间查看行的内容,你可以像下面这样做:
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
  WHERE p.locked_row = a.ctid;不论如何都要小心(自PostgreSQL 8.3起),这样一个查询将会是非常低效率的。
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)Tatsuo Ishii