F.48. pgrowlocks — показать информацию о блокировке строк таблицы#

F.48. pgrowlocks — показать информацию о блокировке строк таблицы

F.48. pgrowlocks — показать информацию о блокировке строк таблицы #

Модуль pgrowlocks предоставляет функцию для отображения информации о блокировке строк для указанной таблицы.

По умолчанию использование ограничено суперпользователям, ролям с привилегиями роли pg_stat_scan_tables и пользователям с разрешениями SELECT на таблицу.

F.48.1. Обзор #

pgrowlocks(text) returns setof record

Параметр - это имя таблицы. Результатом является набор записей, с одной строкой для каждой заблокированной строки в таблице. Выходные столбцы показаны в Таблица F.21.

Таблица F.21. Выходные столбцы pgrowlocks

ИмяТипОписание
locked_rowtidИдентификатор кортежа (TID) заблокированной строки
блокировщикxidИдентификатор транзакции блокировщика, или multixact ID, если многотранзакция; см. Раздел 72.1
multibooleanTrue if locker is a multitransaction
xidsxid[]Идентификаторы транзакций блокировщиков (более одного, если многотранзакционные)
modestext[]Режим блокировки хранилищ (более одного, если многотранзакционный), массив значений Key Share, Share, For No Key Update, No Key Update, For Update, Update.
pidsinteger[]Идентификаторы процессов, блокирующих задние концы (более одного, если многотранзакционные)

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.48.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.48.3. Автор #

Tatsuo Ishii