| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 43. 系統表 | Fast Forward | Next |
視圖 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 字段連接起來獲取持有或者等待持有這個鎖的會話的更多信息。