Pgrowlocks

From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community

Jump to: navigation, search

[编辑] pgrowlocks

目录

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

[编辑] 概述

 pgrowlocks(text) returns setof record

参数是一个表的名字。结果是记录集合,表中被锁定的每行都有一行对应。输出的字段是:

表 F-25. pgrowlocks 输出字段
名字 类型 描述
locked_row tid 锁住行的元组 ID(TID)
lock_type text 为共享锁分享,或者为排它锁排它
locker xid 锁住者的事务 ID,如果是多事务的话则为 multixact ID
multi boolean 如果锁住者是多事务,则为真
xids xid[] 锁住者的事务 ID(如果是多事务则大于一个)
pids integer[] 正在锁住的后端的进程 ID(如果是多事务则多于一个)

pgrowlocks 为目标表申请 AccessShareLock 锁,然后一行行读取表并收集行锁信息。这么做在大表上速度可不快。请注意:

  1. 如果这个表被其它什么东西整个地排它锁住,那么 pgrowlocks 将会被阻塞住。
  2. 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

Personal tools