ltrowlocks
模块提供了一个函数,用于显示指定表的行锁信息。
默认情况下,使用仅限于超级用户、pg_stat_scan_tables角色的成员以及具有表上SELECT权限的用户。
pgrowlocks(text) 返回记录集
参数是表的名称。结果是记录集,每个表中锁定的行对应一行记录。输出列在 Table E.50中显示。
Table E.50. pgrowlocks
输出列
名称 | 类型 | 描述 |
---|---|---|
locked_row | tid | 被锁定行的元组 ID(TID) |
locker | xid | 锁定者的事务 ID,如果是多事务,则为多事务 ID |
multi | boolean | 如果锁定者是多事务,则为 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;
但是请注意,这样的查询非常低效。
=# 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)