登录
F.31. pgrowlocks — 显示表的行锁定信息#
pgrowlocks
模块提供了一个函数,用于显示指定表的行锁定信息。
默认情况下,仅限超级用户、拥有pg_stat_scan_tables
角色权限的角色以及对表拥有SELECT
权限的用户使用。
F.31.1. 概述#
pgrowlocks(text) returns setof record
参数是表的名称。结果是一组记录,表中每行锁定对应一行。输出列显示在表 F.21中。
表 F.21.pgrowlocks
输出列
名称 | 类型 | 描述 |
---|---|---|
locked_row | tid | 锁定行的元组 ID (TID) |
locker | xid | 锁定者的事务 ID,如果是多事务,则为多事务 ID;请参见 第 74.1 节 |
multi | 布尔值 | 如果锁定者是多事务,则为 True |
xids | xid[] | 锁定者的事务 ID(如果是多事务,则有多个) |
modes | text[] | 锁定者的锁定模式(如果是多事务,则有多个),Key Share 、Share 、For No Key Update 、No Key Update 、For Update 、Update 的数组。 |
pids | integer[] | 锁定后端进程的 ID(如果是多事务,则有多个) |
pgrowlocks
为目标表获取AccessShareLock
,并逐行读取每一行以收集行锁定信息。对于大型表,此操作的速度并不快。请注意
如果表上获取了
ACCESS EXCLUSIVE
锁,则pgrowlocks
将被阻止。pgrowlocks
不能保证生成自洽的快照。在执行过程中,可能会获取新的行锁,或释放旧的锁。
pgrowlocks
不会显示已锁定行的内容。如果你想同时查看行内容,你可以执行类似这样的操作
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
WHERE p.locked_row = a.ctid;
但请注意,这样的查询将非常低效。
F.31.2. 示例输出#
=# SELECT * FROM pgrowlocks('t1');
locked_row | locker | multi | xids | modes | pids
------------+--------+-------+-------+----------------+--------
(0,1) | 609 | f | {609} | {"For Share"} | {3161}
(0,2) | 609 | f | {609} | {"For Share"} | {3161}
(0,3) | 607 | f | {607} | {"For Update"} | {3107}
(0,4) | 607 | f | {607} | {"For Update"} | {3107}
(4 rows)
F.31.3. 作者#
Tatsuo Ishii