pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
pgrowlocks 模块提供了一个函数,用于显示指定表的行锁信息。
pgrowlocks(text) returns setof record
参数为表名。结果是一个记录集合,其中表中每个被锁定的行对应结果中的一行。输出列见 表 F.21。
表 F.21. pgrowlocks 输出列
| 名称 | 类型 | 描述 |
|---|---|---|
locked_row |
tid |
被锁定行的元组 ID(TID) |
locker |
xid |
持锁者的事务 ID;若为多事务,则为多事务 ID |
multi |
boolean |
如果持锁者为多事务,则为真 |
xids |
xid[] |
持锁者的事务 ID(若为多事务,则会有多个) |
modes |
text[] |
持锁者的锁模式(若为多事务,则会有多个),是由 Key Share、Share、For No Key Update、No Key Update、For Update、Update 组成的数组。 |
pids |
integer[] |
加锁后端的进程 ID(若为多事务,则会有多个) |
pgrowlocks 会对目标表获取 AccessShareLock, 并逐行读取以收集行锁信息。对于大表,这样做速度并不快。请注意:
如果整张表被其他人独占锁定, 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
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。