| 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