#relation-lock-modes
Какие бывают режимы блокировок отношений и какие из них конфликтуют?
Что отвечать
У таблицы есть восемь режимов блокировки от ACCESS SHARE до ACCESS EXCLUSIVE, и они выстроены по силе. Обычный `SELECT` берёт самый слабый ACCESS SHARE; `INSERT`/`UPDATE`/`DELETE` - ROW EXCLUSIVE; команды вроде `CREATE INDEX` - SHARE; большинство `ALTER TABLE`, `DROP`, `TRUNCATE`, `VACUUM FULL` - самый сильный ACCESS EXCLUSIVE, который конфликтует со всем, включая обычный SELECT. Конфликтуют не сами команды, а режимы: чтения совместимы между собой, а ACCESS EXCLUSIVE несовместим ни с чем. Несовместимый запрос встаёт в очередь.
Что хотят услышать
Senior должен: - понимать, что блокировки навешиваются режимами, а конфликт определяет таблица совместимости, а не имя команды - знать ключевые пары: SELECT берёт ACCESS SHARE, DML берёт ROW EXCLUSIVE, тяжёлый DDL берёт ACCESS EXCLUSIVE - объяснить, что ACCESS EXCLUSIVE блокирует даже читателей, и в этом опасность DDL на горячей таблице - уметь смотреть текущие блокировки и ожидания через `pg_locks` и `pg_stat_activity`
Подводные камни
- ✗ Думать, что `SELECT` ничего не блокирует - он держит ACCESS SHARE, и этого хватает, чтобы заблокировать ACCESS EXCLUSIVE
- ✗ Считать, что блокировки отношений про строки - это блокировки всей таблицы как объекта
- ✗ Путать силу режима с именем команды - конфликт решает таблица совместимости режимов
Follow-up
- ? Почему долгий `SELECT` способен задержать `ALTER TABLE`?
- ? Какой режим берёт обычный `UPDATE`?
- ? Как по `pg_locks` понять, кто кого ждёт?
Глубина в базе знаний