Блокировки в PostgreSQL: какие бывают, как выстраивается очередь и как разбирать дедлок?
Блокировки делятся на уровень таблицы и уровень строки. Табличные (ACCESS SHARE у SELECT, ROW EXCLUSIVE у INSERT/UPDATE/DELETE, ACCESS EXCLUSIVE у ALTER TABLE, VACUUM FULL, TRUNCATE) конфликтуют по матрице совместимости; строчные берутся UPDATE и SELECT FOR UPDATE. Главная опасность в проде — очередь блокировок: ALTER TABLE ждёт завершения долгого SELECT, а все новые запросы встают за ALTER, потому что очередь честная и не пропускает вперёд. Так одна миграция останавливает таблицу, хотя сама выполняется миллисекунды; лечится lock_timeout и повторными попытками. Дедлок — это цикл ожиданий: PostgreSQL находит его через deadlock_timeout (1 с) и убивает одну из транзакций с 40P01. Профилактика простая и почти всегда работает: обращаться к строкам в одном и том же порядке и держать транзакции короткими.