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

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 7.4 已结束支持。 请参阅 当前版本手册.

43.32. pg_locks #

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

pg_locks 为每个活跃的可锁定对象、所请求的锁模式和相关的事务各包含一行。因此,如果多个事务持有或等待同一可锁定对象上的锁,该对象可能出现多次。不过,当前没有锁的对象根本不会出现。一个可锁定对象要么是一个关系,要么是一个事务 ID。

注意该视图只包括表级锁,不包括行级锁。如果一个事务在等待行级锁,它在视图中表现为在等待持有该行锁的事务的事务 ID。

表 43.32. pg_locks 列

名称类型引用描述
relationoidpg_class.oid被锁定关系的 OID,如果可锁定对象是事务 ID 则为 NULL
databaseoidpg_database.oid被锁定关系所在的数据库的 OID;如果被锁定关系是全局共享表则为零;如果可锁定对象是事务 ID 则为 NULL
transactionxid 事务的 ID,如果可锁定对象是关系则为 NULL
pidinteger 持有或等待该锁的服务器进程的进程 ID
modetext 该进程持有或想要的锁模式名(见第 12.3.1 节)
grantedboolean 如果锁已持有则为真,如果在等待锁则为假

在表示某会话持有的锁的行中,granted 为真。为假表示该会话当前正在等待获取该锁,这蕴含着某个其他会话在同一可锁定对象上持有一个冲突的锁模式。等待的会话将休眠,直到其他会话释放该锁(或检测到死锁条件)。一个会话在任意时刻最多只能等待获取一个锁。

每个事务在其整个持续时间内都持有其事务 ID 上的一个排他锁。如果一个事务发现必须专门等待另一个事务,它会通过对另一个事务 ID 尝试获取共享锁来实现。这只有在另一个事务结束并释放其事务 ID 锁之后才会成功。

访问 pg_locks 视图时,内部锁管理器的数据结构会被短暂加锁,并制作一份副本供该视图显示。这确保了视图产生一致的结果集,同时不会比必要的更长时间地阻塞正常的锁管理器操作。尽管如此,还是存在一些与性能相关的注意事项:对该视图的频繁访问可能会对数据库性能产生一些影响。

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

如果启用了统计收集器,pid 列可以连接到 pg_stat_activity 视图的 procpid 列,以获得关于持有或等待持有该锁的会话的更多信息。

报告文档问题

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