Блокировки конкретной таблицы отбираются из pg_locks фильтром по идентификатору отношения. Приведение relation::regclass возвращает читаемое имя объекта, а соединение с pg_stat_activity добавляет к номеру процесса текст запроса и состояние сессии.
Как посмотреть
- Все блокировки указанной таблицы вместе с удерживающими их запросами:
- Столбец granted со значением false отмечает сессию, стоящую в очереди. Столбец mode показывает режим: AccessShareLock устанавливает обычное чтение, RowExclusiveLock – изменение строк, AccessExclusiveLock требуется командам вида ALTER TABLE и VACUUM FULL и несовместим с любыми другими режимами.
- Определить, кто именно удерживает объект, помогает функция pg_blocking_pids, принимающая номер ожидающего процесса:
SELECT l.pid, l.mode, l.granted, a.state, a.query FROM pg_locks l JOIN pg_stat_activity a ON a.pid = l.pid WHERE l.relation = 'public.orders'::regclass;
SELECT pg_blocking_pids(12345);