pgrowlocks
Информация о блокировке строк для заданной таблицы.
Схема размещения:
ext
.Модуль предоставляет функцию
pgrowlocks(text)
, показывающую информацию о блокировке строк для заданной таблицы.pgrowlocks(text) returns SETOF RECORD
В качестве параметра
text
передается имя таблицы.Результат: набор записей, в котором строки соответствуют заблокированным в таблице строкам.
Столбцы результата
pgrowlocks
:Имя | Тип | Описание |
---|---|---|
locked_row | tid | Идентификатор кортежа (TID) блокированной строки |
locker | xid | – Идентификатор блокирующей транзакции; – идентификатор мультитранзакции, если это мультитранзакция |
multi | boolean | Признак мультитранзакции |
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;
Использование модуля по умолчанию разрешено суперпользователям, членам роли
pg_stat_scan_tables
и пользователям с правом SELECT
в заданной таблице.-
сессия № 1:
SELECT * FROM message;
Пример результата выполнения запроса:Раскрыть type=sqlmid | sections | name -----+----------+--------------- 1 | {3,4} | Hi, World! 2 | {1,4} | Hello! World! 3 | {1,2} | Hi, my World! 4 | {2,5} | O, my World! (4 rows)
-
сессия № 2:
BEGIN; UPDATE message SET name = 'Changed' WHERE mid=4;
-
сессия № 1:
SELECT * FROM pgrowlocks('message');
Пример результата выполнения запроса:Раскрыть type=sqllocked_row | locker | multi | xids | modes | pids ------------+--------+-------+----------+-------------------+-------- (0,4) | 105009 | f | {105009} | {"No Key Update"} | {6071} (1 row)
Просмотр блокировки с содержимым строк:SELECT * FROM message AS a, pgrowlocks('message') AS p WHERE p.locked_row = a.ctid;
Пример результата выполнения запроса:Раскрыть type=sqlmid | sections | name | locked_row | locker | multi | xids | modes | pids -----+----------+--------------+------------+--------+-------+----------+-------------------+-------- 4 | {2,5} | O, my World! | (0,4) | 105009 | f | {105009} | {"No Key Update"} | {6071} (1 row)
Другой пример результата выполнения функции:SELECT * FROM pgrowlocks('t1');
Пример результата выполнения запроса:Раскрыть type=sqllocked_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)
Дополнительную информацию по поставляемому модулю pgrowlocks можно получить по ссылке.