pgrowlocks 模块提供了一个函数,用于显示指定表的行锁定信息。
默认情况下,使用权限受限于超级用户、拥有pg_stat_scan_tables角色的用户以及对表拥有SELECT权限的用户。
pgrowlocks(text) returns setof record
参数是表的名称。结果是一组记录,对于表中每个被锁定的行,都有一行输出。输出列显示在表 F.21中。
表 F.21. pgrowlocks 输出列
| 名称 | 类型 | 描述 |
|---|---|---|
locked_row |
tid |
被锁定行的元组 ID(TID) |
locker |
xid |
锁定者的事务 ID,如果是多事务则为 multixact ID;参见第 67.1 节 |
multi |
boolean |
如果锁定者是多事务,则为 True |
xids |
xid[] |
锁定者的事务 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