F.29. pgrowlocks — отображение информации о блокировке строк таблицы #

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

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

F.29.1. Обзор #

pgrowlocks(text) returns setof record

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

Таблица F.20. Столбцы результата pgrowlocks

ИмяТипОписание
locked_rowtidИдентификатор кортежа (TID) блокированной строки
lockerxidИдентификатор блокирующей транзакции или идентификатор мультитранзакции, если это мультитранзакция (см. Раздел 66.1)
multibooleanTrue, если блокирующий субъект — мультитранзакция
xidsxid[]Идентификаторы блокирующих транзакций (больше одной для мультитранзакции)
modestext[]Режим блокировки (больше одного для мультитранзакции), массив со значениями For Key Share, For 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.29.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.29.3. Автор #

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