2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

F.31. pgrowlocks — 顯示錶的行鎖定資訊 #

pgrowlocks 模組提供了一個函式,用於顯示指定表的行鎖定資訊。

預設情況下,使用許可權受限於超級使用者、擁有pg_stat_scan_tables角色的使用者以及對錶擁有SELECT許可權的使用者。

F.31.1. 概述 #

pgrowlocks(text) returns setof record

引數是表的名稱。結果是一組記錄,對於表中每個被鎖定的行,都有一行輸出。輸出列顯示在表 F.21中。

表 F.21. pgrowlocks 輸出列

名稱 型別 描述
locked_row tid 被鎖定行的元組 ID(TID)
locker xid 鎖定者的事務 ID,如果是多事務則為 multixact ID;參見第 67.1 節
multi boolean 如果鎖定者是多事務,則為 True
xids xid[] 鎖定者的事務 ID(如果是多事務,則可能不止一個)
modes text[] 鎖定者的鎖模式(如果是多事務,則可能不止一個),是For Key ShareFor ShareFor No Key UpdateNo Key UpdateFor UpdateUpdate 的陣列。
pids integer[] 鎖定後端的程序 ID(如果是多事務,則可能不止一個)

pgrowlocks 對目標表獲取 AccessShareLock 並逐行讀取以收集行鎖定資訊。對於大表來說,這效率不高。請注意:

  1. 如果對錶獲取了 ACCESS EXCLUSIVE 鎖,pgrowlocks 將會被阻塞。

  2. pgrowlocks 不保證產生一致的快照。在執行過程中,可能會有新的行被鎖定,或者舊的鎖被釋放。

pgrowlocks 不顯示被鎖定行的內容。如果你想同時檢視行內容,可以這樣做:

SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
  WHERE p.locked_row = a.ctid;

但請注意,這樣的查詢效率會非常低。

F.31.2. 示例輸出 #

=# SELECT * FROM pgrowlocks('t1');
 locked_row | locker | multi | xids  |     modes      |  pids
------------+--------+-------+-------+----------------+--------
 (0,1)      |    609 | f     | {609} | {"For Share"}  | {3161}
 (0,2)      |    609 | f     | {609} | {"For Share"}  | {3161}
 (0,3)      |    607 | f     | {607} | {"For Update"} | {3107}
 (0,4)      |    607 | f     | {607} | {"For Update"} | {3107}
(4 rows)

F.31.3. 作者 #

Tatsuo Ishii

提交更正

如果您在文件中發現任何不正確、與您對特定功能的實際體驗不符或需要進一步澄清的內容,請使用此表格報告文件問題。