↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

43.32. pg_locks #

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

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

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

表 43.32. pg_locks 列

名称 类型 引用 描述
relation oid pg_class.oid 被锁定关系的 OID,如果可锁定对象是事务 ID 则为 NULL
database oid pg_database.oid 被锁定关系所在的数据库的 OID;如果被锁定关系是全局共享表则为零;如果可锁定对象是事务 ID 则为 NULL
transaction xid   事务的 ID,如果可锁定对象是关系则为 NULL
pid integer   持有或等待该锁的服务器进程的进程 ID
mode text   该进程持有或想要的锁模式名(见 第 12.3.1 节)
granted boolean   如果锁已持有则为真,如果在等待锁则为假

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

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

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

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

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

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。