| PostgreSQL 9.3.4 文档 | ||||
|---|---|---|---|---|
| Prev | Up | Appendix F. 额外提供的模块 | Next | |
pgrowlocks模块提供了一个函数来显示一个指定表的行锁定信息。
pgrowlocks(text) 返回 setof record
参数是一个表的名称。结果是一个记录集合,其中每一行对应表中一个被锁定的行。输出列如Table F-19所示。
Table F-19. pgrowlocks 输出列
| 名称 | 类型 | 描述 | 
|---|---|---|
| locked_row | tid | 被锁定行的元组 ID(TID) | 
| locker | xid | 持锁者的事务 ID,如果是多事务则为多事务 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