pgrowlocks
Модуль pgrowlocks предоставляет функцию, показывающую информацию о блокировке строк для заданной таблицы.
По умолчанию его использование разрешено суперпользователям, членам роли pg_stat_scan_tables и пользователям с правом SELECT в заданной таблице.
Обзор
pgrowlocks(text) returns setof record
В параметре передается имя таблицы. Возвращаемый результат представляет собой набор записей, в котором каждая строка соответствует заблокированной строке в таблице. Столбцы вывода перечислены в Таблице 20.
Таблица 20. Столбцы вывода pgrowlocks
Параметр | Тип | Описание |
---|---|---|
locked_row | tid | Идентификатор кортежа (TID) блокированной строки |
locker | xid | Идентификатор блокировочной транзакции или идентификатор мультитранзакции, если это мультитранзакция |
multi | boolean | True, если блокиратор — мультитранзакция |
xids | xid[] | Идентификаторы блокирующих транзакций (больше одного, если это мультитранзакция) |
modes | text[] | Режим блокирования (больше одного, если это мультитранзакция), массив со значениями Key Share, Share, For No Key Update, No Key Update, For Update, Update. |
pids | integer[] | Идентификаторы блокирующих обслуживающих процессов (больше одного, если это мультитранзакция) |
Функция pgrowlocks запрашивает блокировку AccessShareLock для целевой таблицы и считывает строки одну за другой для сбора информации о блокировке строк. Для большой таблицы это происходит небыстро. Обратите внимание, что:
-
Если таблица заблокирована в режиме ACCESS EXCLUSIVE, функция pgrowlocks будет блокироваться.
-
Функция 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)