codecamp

PostgreSQL pgrowlocks

F.28.1. 概述
F.28.2. 样例输出

pgrowlocks模块提供了一个函数来显示一个指定表的行锁定信息。

默认情况下,使用仅限于超级用户、pg_stat_scan_tables 角色的成员和在该表上拥有SELECT权限的用户。

F.28.1. 概述

pgrowlocks(text) 返回 setof record

参数是一个表的名称。结果是一个记录集合,其中每一行对应表中一个被锁定的行。输出列如表 F.20所示。

表 F.20. pgrowlocks 输出列

名称 类型 描述
locked_row tid 被锁定行的元组 ID(TID)
locker xid 持锁者的事务 ID,如果是多事务则为多事务 ID
multi boolean 如果持锁者是一个多事务,则为真
xids xid[] 持锁者的事务 ID(如果是多事务则多于一个)
modes text[] 持锁者的锁模式(如果是多事务则多于一个),是一个Key ShareShareFor No Key UpdateNo Key UpdateFor UpdateUpdate组成的数组。
pids integer[] 锁定后端的进程 ID(如果是多事务则多于一个)

pgrowlocks会为目标表加AccessShareLock并且一个一个读取每一行来收集行的锁定信息。这对于一个大表不是很快。注意:

  1. 如果表被其他人整体加上了排他锁,pgrowlocks将被阻塞。

  2. pgrowlocks不保证能产生一个自我一致的快照。在它执行期间,有可能加上一个新行锁,也有可能有旧行锁被释放。

pgrowlocks不显示被锁定行的内容。如果你想同时查看行内容,你可以这样做:

SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
  WHERE p.locked_row = a.ctid;

不过要注意,这样一个查询将非常低效。

F.28.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)

 

PostgreSQL pg_prewarm
PostgreSQL pg_stat_statements
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

PostgreSQL SQL语言

PostgreSQL 服务器管理

PostgreSQL 客户端接口

PostgreSQL 服务器编程

PostgreSQL 参考

PostgreSQL 内部

PostgreSQL 附录

PostgreSQL 参考书目

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }