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