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

pgrowlocks. Информация о блокировке строк для заданной таблицы

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: ext.

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

pgrowlocks(text) returns SETOF RECORD

В качестве параметра text передается имя таблицы.

Результат: набор записей, в котором строки соответствуют заблокированным в таблице строкам.

Столбцы результата pgrowlocks:

ИмяТипОписание
locked_rowtidИдентификатор кортежа (TID) блокированной строки
lockerxid– Идентификатор блокирующей транзакции;
– идентификатор мультитранзакции, если это мультитранзакция
multibooleanПризнак мультитранзакции
xidsxid[]Идентификаторы блокирующих транзакций (больше одной для мультитранзакции)
modestext[]Режим блокирования (больше одного для мультитранзакции), массив со значениями:
Key Share
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;

Доработка

Доработка не проводилась.

Ограничения

Ограничения отсутствуют.

Установка

При наличии прав администратора СУБД включение модуля выполняется запросом:

CREATE EXTENSION pgrowlocks SCHEMA ext;

Настройка

Настройка не требуется.

Использование модуля

Использование модуля по умолчанию разрешено:

  • суперпользователям;
  • членам роли pg_stat_scan_tables;
  • пользователям с правом SELECT в заданной таблице.

Сессия № 1:

SELECT * FROM message;

Пример результата выполнения запроса:

 mid | 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');

Пример результата выполнения запроса:

 locked_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;

Пример результата выполнения запроса:

 mid | 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');

Пример результата выполнения запроса:

 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)

Ссылки на документацию разработчика

Исходная документация PosgreSQL по модулю pgrowlocks: https://www.postgresql.org/docs/15/pgrowlocks.html