pgrowlocks

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

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


Обзор

pgrowlocks(text) returns setof record

В параметре передается имя таблицы. Возвращаемый результат представляет собой набор записей, в котором каждая строка соответствует заблокированной строке в таблице. Столбцы вывода перечислены в Таблице 20.

Таблица 20. Столбцы вывода pgrowlocks

ПараметрТипОписание
locked_rowtidИдентификатор кортежа (TID) блокированной строки
lockerxidИдентификатор блокировочной транзакции или идентификатор мультитранзакции, если это мультитранзакция
multibooleanTrue, если блокиратор — мультитранзакция
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;

Однако учтите, что такой запрос будет крайне неэффективным.


Пример вывода

=# 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)

Автор

Тацуо Исии (Tatsuo Ishii)