F.39. pgrowlocks — показать информацию о блокировке строк таблицы#
F.39. pgrowlocks — показать информацию о блокировке строк таблицы #
Модуль pgrowlocks
предоставляет функцию для отображения информации о блокировке строк для указанной таблицы.
По умолчанию использование ограничено суперпользователям, ролям с привилегиями роли pg_stat_scan_tables
и пользователям с разрешениями SELECT
на таблицу.
F.39.1. Обзор #
pgrowlocks(text) returns setof record
Параметр - это имя таблицы. Результатом является набор записей, с одной строкой для каждой заблокированной строки в таблице. Выходные столбцы показаны в Таблица F.21.
Таблица F.21. Выходные столбцы pgrowlocks
Имя | Тип | Описание |
---|---|---|
locked_row | tid | Идентификатор кортежа (TID) заблокированной строки |
блокировщик | xid | Идентификатор транзакции блокировщика, или multixact ID, если многотранзакция; см. Раздел 71.1 |
multi | boolean | True if locker is a multitransaction |
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;
Однако следует помнить, что такой запрос будет очень неэффективным.
F.39.2. Пример вывода #
=# 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)
F.39.3. Автор #
Tatsuo Ishii