pgrowlocks 模块提供一个函数,用于显示指定表的行锁定信息。
默认情况下,仅限超级用户、具有 pg_stat_scan_tables 角色权限的角色和具有对表 SELECT 权限的用户可以使用。
pgrowlocks(text) returns setof record
参数是表的名称。结果是一组记录,表内每一行锁定对应一行。输出列显示在 表 F.20 中。
表 F.20. pgrowlocks
输出列
名称 | 类型 | 说明 |
---|---|---|
locked_row |
tid |
已锁定行的元组 ID (TID) |
locker |
xid |
锁持有者的事务 ID,如果是多事务,则是多重事务 ID;请参见 第 66.1 节 |
multi |
布尔值 |
如果是多事务,则为 True |
xids |
xids[] |
锁持有者的事务 ID(如果是多事务,有多个) |
modes |
text[] |
锁持有者的锁定模式(如果是多事务,则不止一个),数组中的值有 For Key Share 、For 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;
但是要注意,执行此类查询非常低效。
=# 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)
Tatsuo Ishii