Текущие блокировки видны в системном представлении pg_locks, а сведения о сессиях – в pg_stat_activity. Практическую пользу дает соединение этих представлений: оно показывает, какой запрос ждет и кто его блокирует. Важно учитывать, что данные отражают только текущий момент – после снятия блокировки записи исчезают.
Текст запросов в pg_stat_activity виден только для собственных сессий роли. Полная картина по всему кластеру доступна суперпользователю или роли с членством в pg_read_all_stats.
Запросы для поиска блокировок
- Определите ожидающие сессии и их блокировщиков:
SELECT pid, wait_event_type, wait_event, state, query, pg_blocking_pids(pid) AS blocked_by FROM pg_stat_activity WHERE cardinality(pg_blocking_pids(pid)) > 0;
SELECT locktype, relation::regclass, mode, granted, pid FROM pg_locks WHERE NOT granted;
SELECT pg_terminate_backend(12345);