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;
Доработка
Доработка не проводилась.
Ограничения
Ограничения отсутствуют.
Установка
При наличии прав администратора СУБД включение модуля выполняется запросом:
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