Исключающие ограничения: гарантия отсутствия пересечений на уровне БД! — 13 мая 2026 г. в 17:45:21.621
Исключающие ограничения: гарантия отсутствия пересечений на уровне БД! Проверять пересекаются ли интервалы через SELECT перед INSERT — классическая ошибка, которая ломается при конкурентных транзакциях. SELECT 1 FROM bookings WHERE room_id = 101 AND start_at < $end AND end_at > $start; Даже если проверка есть, два параллельных запроса могут пройти её одновременно и записать конфликтующие данные: CREATE EXTENSION IF NOT EXISTS btree_gist; PostgreSQL решает это на уровне ограничений через exclusion constraint, который работает корректно даже при конкуренции: ALTER TABLE bookings ADD CONSTRAINT no_overlap EXCLUDE USING gist ( room_id WITH =, tsrange(start_at, end_at) WITH && ); exclusion constraint — это способ переложить сложную логику (пересечения, диапазоны, уникальность по условиям) с приложения на уровень СУБД с полной защитой от состояния гонки. SQL Ready | #совет

