Pgrowlocks
From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community
[编辑] pgrowlocks
pgrowlocks 模块提供一个函数显示指定的表的行锁的信息。
[编辑] 概述
pgrowlocks(text) returns setof record
参数是一个表的名字。结果是记录集合,表中被锁定的每行都有一行对应。输出的字段是:
| 名字 | 类型 | 描述 |
| locked_row | tid | 锁住行的元组 ID(TID) |
| lock_type | text | 为共享锁分享,或者为排它锁排它 |
| locker | xid | 锁住者的事务 ID,如果是多事务的话则为 multixact ID |
| multi | boolean | 如果锁住者是多事务,则为真 |
| xids | xid[] | 锁住者的事务 ID(如果是多事务则大于一个) |
| 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
