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

Примечание

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

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

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

Обзор#

pgrowlocks(text) returns setof record

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

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

Имя

Тип

Описание

locked_row

tid

Идентификатор кортежа (TID) заблокированной строки

locker

xid

Идентификатор транзакции блокиратора или идентификатор мультитранзакции, если это мультитранзакция

multi

boolean

Истина, если блокировка является мультитранзакцией

xids

xid[]

Идентификаторы транзакций блокировок (более одного, если мультитранзакция)

modes

text[]

Режим блокировки замков (более одного, если много транзакций), массив из For Key Share, For Share, For No Key Update, No Key Update, For Update, Update.

pids

integer[]

Идентификаторы процессов блокирующих бэкендов (более одного, если много транзакций)

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)