Перейти к основному содержимому

pgrowlocks — информация о блокировках строк в таблице

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

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

Обзор

pgrowlocks(text) returns setof record

Параметр является именем таблицы. Результат представляет собой набор записей с одной строкой для каждой заблокированной строки внутри таблицы. Столбцы вывода показаны в таблице ниже.

Столбцы вывода pgrowlocks:

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

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

Образец вывода

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