视图 pg_locks 提供有关在数据库服务器中 由打开的事务持有的锁的信息。参阅 Chapter 12 获取有关 锁的更多的讨论。
pg_locks 对每个活跃的可锁定对象,请求的锁模式, 以及相关的事务保存一行。因此,如果多个事务持有或者等待对同一个对象的锁, 那么同一个可锁定的对象可能出现多次。不过,一个目前没有锁在其上的对象将 肯定不会出现。一个可锁定的对象要么是一个关系(也就是说,一个表),要么 是一个事务 ID。
请注意这个视图是包含表级锁,而不包括行级锁。如果一个事务在等待 一个行级锁,它将在视图中表现为等待那个行锁的持有者的事务ID。
Table 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 | 这个进程持有的或者是期望的锁模式(参阅 Section 12.3.1) | |
granted | boolean | 如果持有锁,为真,如果等待锁,为假 |
一行里的 granted 为真时表明指定会话持有一个锁。 假则表明该会话当前等待使用这个锁,这就暗示着某个其它的会话正在同样的可锁定 对象上持有冲突的锁模式。等待的会话将一直睡眠,直到另外一个锁释放(或者侦测 到一个死锁条件)。一个会话一次最多等待一个锁。
每个事务都在它持续的时间里在他自己的事务 ID 上持有一个排他锁。如果一个事务 认为它必须等待另外一个事务,它会以企图在另外一个事务 ID 上获取共享锁的方式 实现之。这个锁只有在另外一个事务终止并且释放它的锁的前提下才能成功。
在访问 pg_locks 视图的时候,内部的锁管理器 数据结构会暂时被锁住,然后制作一份这个视图的拷贝用于显示。这样就保证 了视图生成一套连贯的结果,它不会不必要地过分阻塞普通的锁管理器。但是 如果这个视图访问得太频繁,肯定是会对数据库性能有些影响的。
pg_locks 提供了一个数据库集群里的所有的锁的 全局视图,而不仅仅那些和当前数据库相关的。尽管它的 relation 字段可以和 pg_class.oid 连接起来以标识 被锁住的关系,但是这个方法目前只能对在当前数据库里的关系有用(那些 database 字段是当前数据库的 OID 或者零的数据库)。
如果你打开了统计收集器,pid 字段可以 可以和 pg_stat_activity 视图的 procpid 字段连接起来获取持有或者等待持有这个锁的会话的更多信息。