10.3. 查看锁

监控数据库活动的另外一个有用的工具是系统表 pg_locks。 这样就允许数据库管理员查看在锁管理器里面的未决的锁的信息。比如, 这个功能可以用于:

有关更多 PostgreSQL 的锁和管理并发性的 信息,请参考 PostgreSQL 7.3.3 用户手册

注意: 在访问 pg_locks 视图的时候,锁管理器的内部 数据结构被瞬间锁住,然后复制一份拷贝给视图呈现。这样就保证了 这个视图提供给我们一套一致地结果集。但是如果我们过于频繁地查看 这个视图,那么肯定会对数据库性能有一点影响。

Table 10-3 显示了 pg_locks 的字段定义。 pg_locks 里对每个可以锁定和可以请求锁模式的对象 都包含一行。因此,如果多个事务都持有或者等待一个对象的锁,那么同一 个可锁定对象可能会出现多次。一个可锁定对象要么是一个关系,要么是一个 事务 ID。(请注意这个视图只包含表级别的锁,没有行级别的锁。如果一个 事务在等待一个行级别的锁,那么在这个视图里会表现成在等待一个持有该锁的 当前事务的 ID。)

Table 10-3. 锁状态系统视图

字段名类型描述
relationoid 被锁定的关系的 OID,如果可锁定对象是一个事务 ID,那么这个字段是 NULL。 我们可以用这个字段和 pg_class 系统表进行连接,获取 有关被锁定关系的更多信息。不过,请注意这个功能只是对当前数据库的关系 有效(就是那些 database 字段要么是当前数据库 的 OID,要么是零的关系。)
databaseoid 被锁定关系所存在的数据库的 OID,如果可锁定对象是事务 ID,则为 NULL。 如果这个锁是在一个全局共享表上面的,那么这个字段会是零。我们可以用 这个字段和 pg_database 系统表进行连接,获取有关 被锁定对象的数据库的更多信息。
transactionxid 一个事务的 ID,如果可锁定对象是一个关系则为 NULL。每个事务在其整个生命期 中都在它的事务 ID 上持有一个排他锁。如果一个事务觉得有必要等待另外一个特定 的事务,它会象企图请求在那个事务 ID 上的共享锁那样进行处理。只有在那个事务 终止并释放它的锁之后,这个请求才可能成功。
pidint4 请求了或者是企图请求该锁的 PostgreSQL 后端的进程 ID。 这个进程属于这个会话。 如果你打开了统计收机器,那么这个字段可以和 pg_stat_activity 视图连接起来获取有关持有或者等待持有该锁的后端的信息。
modetext 对可锁定对象请求的或者持有的锁模式。有关 PostgreSQL 里面可用的不同锁模式的更多信息,请参考PostgreSQL 7.3.3 用户手册
isgrantedbool 如果这个锁已经批准,则为真(也就是说被这个会话持有)。假则表明这个 后端目前正在等待获取这个锁,也就意味着其它某个后端在同一个可锁定对象 上持有一个冲突的锁模式。这个后端将休眠到其它锁释放(或者是等到侦测出 死锁条件)。单个后端在任意时刻只能等到批准最多一个锁。