↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4
历史版本。 PostgreSQL 8.0 已结束支持。 请参阅 当前版本手册.

41.33. pg_locks #

视图pg_locks提供了对数据库服务器中打开的事务持有的锁的信息的访问。有关锁定的更多讨论,请参见第 12 章。

pg_locks包含每个活动的可锁定对象、请求的锁模式和相关事务的一行。因此,如果多个事务正在持有或等待锁定它,同一可锁定对象可能会出现多次。但是,当前没有任何锁定的对象将不会出现。

注意,这个视图只包括表级锁,不包括行级锁。如果一个事务正在等待一个行级锁,它在视图中将显示为等待该行锁当前持有者的事务 ID。

表 41.33. pg_locks Columns

名称类型引用 描述
relationoidpg_class.oid 作为锁目标的关系的OID,如果目标既不是关系,也不是关系的一部分则此列为 NULL
databaseoidpg_database.oid 锁目标存在的数据库的OID,如果目标是一个共享对象则为0,如果目标是一个事务ID则为 NULL
transactionxid 一个事务的 ID,如果可锁定对象是一个关系则为 NULL
pidinteger  保持这个锁或者正在等待这个锁的服务器进程的PID,如果此锁被一个预备事务所持有则此列为 NULL
modetext 此进程已持有或者希望持有的锁模式的名称(参见第 12.3.1 节)
grantedboolean  如果锁已授予则为真,如果锁被等待则为假

在表示由指定事务持有的锁的行中,granted 为真。为假表示该事务当前正在等待获取此锁,这意味着某个其他事务正在同一可锁定对象上持有冲突的锁模式。等待的事务会休眠,直到另一个锁被释放(或检测到死锁情况)。单个事务一次最多只能等待获取一个锁。

每个事务在其整个持续期内都对其事务 ID 持有独占锁。如果一个事务发现它必须专门等待另一个事务,它会通过尝试获取另一个事务 ID 的共享锁来实现。只有当另一个事务终止并释放其锁时,这才会成功。

当访问pg_locks视图时,内部锁管理器的数据结构会被短暂地锁定,并为该视图复制一份用于显示。这确保了视图产生一致的结果集,同时不会对普通锁管理操作造成超出必要的阻塞。尽管如此,如果频繁读取这个视图,可能会对数据库性能产生一定影响。

pg_locks提供的是整个数据库集簇中所有锁的全局视图,而不仅是与当前数据库相关的锁。虽然它的relation列可以与pg_class.oid连接来识别被锁定的关系,但这只对当前数据库中的关系(即database列为当前数据库的 OID 或零的那些)能正确工作。

如果你启用了统计收集器,那么pid列可以与pg_stat_activity视图的procpid列连接,以获取持有锁或等待持有锁的会话的更多信息。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.