pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
pg_locks #视图pg_locks提供了对数据库服务器中打开的事务持有的锁的信息的访问。有关锁定的更多讨论,请参见第 12 章。
pg_locks包含每个活动的可锁定对象、请求的锁模式和相关事务的一行。 因此,如果多个事务正在持有或等待锁定它,同一可锁定对象可能会出现多次。 但是,当前没有任何锁定的对象将不会出现。
注意,这个视图只包括表级锁,不包括行级锁。如果一个事务正在等待一个行级锁,它在视图中将显示为等待该行锁当前持有者的事务 ID。
表 41.33. pg_locks Columns
| 名称 | 类型 | 引用 | 描述 |
|---|---|---|---|
relation |
oid |
|
作为锁目标的关系的OID,如果目标既不是关系,也不是关系的一部分则此列为 NULL |
database |
oid |
|
锁目标存在的数据库的OID,如果目标是一个共享对象则为0,如果目标是一个事务ID则为 NULL |
transaction |
xid |
一个事务的 ID,如果可锁定对象是一个关系则为 NULL | |
pid |
integer |
保持这个锁或者正在等待这个锁的服务器进程的PID,如果此锁被一个预备事务所持有则此列为 NULL | |
mode |
text |
此进程已持有或者希望持有的锁模式的名称(参见第 12.3.1 节) | |
granted |
boolean |
如果锁已授予则为真,如果锁被等待则为假 |
在表示由指定事务持有的锁的行中,granted 为真。为假表示该事务当前正在等待获取此锁, 这意味着某个其他事务正在同一可锁定对象上持有冲突的锁模式。等待的事务会休眠,直到另一个锁被释放 (或检测到死锁情况)。单个事务一次最多只能等待获取一个锁。
每个事务在其整个持续期内都对其事务 ID 持有独占锁。如果一个事务发现它必须专门等待另一个事务,它会通过尝试获取另一个事务 ID 的共享锁来实现。只有当另一个事务终止并释放其锁时,这才会成功。
当访问pg_locks视图时,内部锁管理器的数据结构会被短暂地锁定,并为该视图复制一份用于显示。这确保了视图产生一致的结果集,同时不会对普通锁管理操作造成超出必要的阻塞。尽管如此,如果频繁读取这个视图,可能会对数据库性能产生一定影响。
pg_locks提供的是整个数据库集簇中所有锁的全局视图,而不仅是与当前数据库相关的锁。虽然它的relation列可以与pg_class.oid连接来识别被锁定的关系,但这只对当前数据库中的关系(即database列为当前数据库的 OID 或零的那些)能正确工作。
如果你启用了统计收集器,那么pid列可以与pg_stat_activity视图的procpid列连接,以获取持有锁或等待持有锁的会话的更多信息。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。