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

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

10.3. 查看锁 #

另一个用于监视数据库活动的有用工具是 pg_locks 系统目录。它允许数据库管理员查看锁管理器中当前存在的锁的信息。例如,这个功能可以被用于:

  • 查看当前存在的所有锁、在一个特定数据库中的关系上所有的锁、在一个特定关系上所有的锁,或者由一个特定PostgreSQL会话持有的所有的锁。

  • 查看当前数据库中未授予锁最多的关系(这可能是数据库客户端之间争用的来源)。

  • 判断锁竞争给数据库总体性能带来的影响,以及锁竞争随着整个数据库流量的变化范围。

For more information on locking and managing concurrency with PostgreSQL, refer to the PostgreSQL 用户指南.

注意

访问 pg_locks 视图时,内部锁管理器数据结构会被短暂锁定,并制作一个副本供该视图显示。这确保该视图产生一致的结果集,同时不会不必要地长时间阻塞正常的锁管理器操作。尽管如此,如果频繁查看这个视图,可能会对数据库性能有一定影响。

表 10.3给出了 pg_locks 各列的定义。pg_locks 视图为每个可锁定对象和请求的锁模式包含一行。因此,如果多个事务正在持有或等待某个对象上的锁,同一个可锁定对象可能出现多次。可锁定对象是关系或事务 ID。(注意这个视图只包含表级锁,不包含行级锁。如果一个事务在等待行级锁,它在视图中将显示为等待该行锁当前持有者的事务 ID。)

表 10.3. 锁状态系统视图

列名类型描述
relationoid 被锁定关系的 OID;如果可锁定对象是事务 ID 则为空。这一列可以与 pg_class 系统目录连接来获得被锁定关系的更多信息。但注意这只对当前数据库中的关系有效(即 database 列为当前数据库的 OID 或零的那些)。
databaseoid 被锁定关系所在数据库的 OID;如果可锁定对象是事务 ID 则为空。如果锁在全局共享的表上,这个字段为零。这一列可以与 pg_database 系统目录连接来获得被锁定对象所属数据库的更多信息。
transactionxid 事务的 ID;如果可锁定对象是关系则为空。每个事务在其整个期间都在自己的事务 ID 上持有排他锁。如果一个事务发现需要专门等待另一个事务,它会通过试图获取另一个事务 ID 上的共享锁来实现。这只有在另一个事务终止并释放其锁时才会成功。
pidinteger 已获取或正在试图获取锁的会话所属 PostgreSQL 后端的进程 ID。如果启用了统计收集器,这一列可以与 pg_stat_activity 视图连接来获得持有或等待持有该锁的后端的更多信息。
modetext 在可锁定对象上请求或持有的锁的模式。关于 PostgreSQL 中可用的各种锁模式的更多信息,请参阅 PostgreSQL 用户指南。
isgrantedboolean 如果锁已被授予(由该会话持有)则为真。为假表示该会话当前正在等待获取这个锁,这意味着某个其他会话正在同一可锁定对象上持有冲突的锁模式。这个后端将休眠直到另一个锁被释放(或检测到死锁)。单个后端一次最多只能等待获取一个锁。

报告文档问题

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