43.32. pg_locks

視圖 pg_locks 提供有關在數據庫服務器中 由打開的事務持有的鎖的信息。參閱 Chapter 12 獲取有關 鎖的更多的討論。

pg_locks 對每個活躍的可鎖定對象,請求的鎖模式, 以及相關的事務保存一行。因此,如果多個事務持有或者等待對同一個對象的鎖, 那麼同一個可鎖定的對象可能出現多次。不過,一個目前沒有鎖在其上的對象將 肯定不會出現。一個可鎖定的對象要麼是一個關系(也就是說,一個表),要麼 是一個事務 ID。

請注意這個視圖是包含表級鎖,而不包括行級鎖。如果一個事務在等待 一個行級鎖,它將在視圖中表現為等待那個行鎖的持有者的事務ID。

Table 43-32. pg_locks 字段

名字類型引用描述
relationoidpg_class.oid 鎖住的關系的 OID,如果鎖住的對象是一個事務 ID,就是 NULL。
databaseoidpg_database.oid 被鎖住的關系所在的數據庫的 OID,如果被鎖定對象是全局共享的表, 那麼就是零,如果可鎖定的對象是一個事務 ID,就是 NULL。
transactionxid  事務的 ID,如果可鎖定的對象是一個關系,就是 NULL
pidinteger 持有或者等待這個所的服務器進程的進程 ID
modetext 這個進程持有的或者是期望的鎖模式(參閱 Section 12.3.1
grantedboolean 如果持有鎖,為真,如果等待鎖,為假

一行裡的 granted 為真時表明指定會話持有一個鎖。 假則表明該會話當前等待使用這個鎖,這就暗示著某個其它的會話正在同樣的可鎖定 對象上持有衝突的鎖模式。等待的會話將一直睡眠,直到另外一個鎖釋放(或者偵測 到一個死鎖條件)。一個會話一次最多等待一個鎖。

每個事務都在它持續的時間裡在他自己的事務 ID 上持有一個排他鎖。如果一個事務 認為它必須等待另外一個事務,它會以企圖在另外一個事務 ID 上獲取共享鎖的方式 實現之。這個鎖只有在另外一個事務終止並且釋放它的鎖的前提下才能成功。

在訪問 pg_locks 視圖的時候,內部的鎖管理器 數據結構會暫時被鎖住,然後制作一份這個視圖的拷貝用于顯示。這樣就保證 了視圖生成一套連貫的結果,它不會不必要地過分阻塞普通的鎖管理器。但是 如果這個視圖訪問得太頻繁,肯定是會對數據庫性能有些影響的。

pg_locks 提供了一個數據庫集群裡的所有的鎖的 全局視圖,而不僅僅那些和當前數據庫相關的。盡管它的 relation 字段可以和 pg_class.oid 連接起來以標識 被鎖住的關系,但是這個方法目前只能對在當前數據庫裡的關系有用(那些 database 字段是當前數據庫的 OID 或者零的數據庫)。

如果你打開了統計收集器,pid 字段可以 可以和 pg_stat_activity 視圖的 procpid 字段連接起來獲取持有或者等待持有這個鎖的會話的更多信息。