управляемый lock manager'ом механизм блокировок в PostgreSQL, предназначенный для координации доступа к высокоуровневым объектам БД: таблицам, индексам и другим объектам БД

Особенности:

  • Могут устанавливаться автоматически или вручную
  • Обычно действуют до конца транзакции (или сессии для advisory locks)
  • Количество Heavyweight Lock ограничено — лимит определяется, в первую очередь, параметрами max_locks_per_transaction и max_connections
  • Используются для ожидания блокировок и участвуют в обнаружении deadlock
  • Имеют 8 режимов: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE

Heavyweight Lock будет автоматически установлен при выполнении SELECT ... FOR UPDATE / FOR SHARE и др., UPDATE, DELETE, ALTER, DROP, TRUNCATE, VACUUM


-- Посмотреть Heavyweight Lock
SELECT locktype, -- Heavyweight отображаются как locktype = relation, advisory и др.
        relation::regclass,
        mode, -- один из режимов
        granted -- true получена, false ожидает
FROM pg_locks;

LOCK TABLE table_name IN EXCLUSIVE MODE; -- установить блокировку (будет установлена Heavyweight)

Кроме Heavyweight есть другие механизмы блокировок: lightweight и spinlock