41.33. pg_locks

視圖 pg_locks 提供有關在資料庫伺服器中由打開的交易持有的鎖的訊息。 參閱 Chapter 12 獲取有關鎖的更多的討論。

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

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

Table 41-33. 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 字串連接起來獲取持有或者等待持有這個鎖的會話的更多訊息。