🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# F.27\. pgrowlocks `pgrowlocks`模块提供一个显示指定的表的行锁定信息的函数。 ## F.27.1\. 概述 ``` pgrowlocks(text) returns setof record ``` 该参数是一个表的名字。结果是一组记录,一行代表表中的一个锁定的行。 输出字段在[Table F-19](#calibre_link-1173)中显示。 **Table 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`作为目标表, 并且一行一行的读取行以采集行锁的信息。这对于大表来说不是非常快。请注意; 1. 如果表作为一个整体是被他人排他锁的,那么`pgrowlocks`将被阻塞。 2. `pgrowlocks`不保证生成一个自我一致的快照。 在执行期间,获得一个新的行锁或释放一个旧锁都是可能的。 `pgrowlocks`并不显示锁定的行的内容。 如果你希望同一时间查看行的内容,你可以像下面这样做: ``` SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p WHERE p.locked_row = a.ctid; ``` 不论如何都要小心(自PostgreSQL 8.3起),这样一个查询将会是非常低效率的。 ## F.27.2\. 示例输出 ``` 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) ``` ## F.27.3\. 作者 Tatsuo Ishii