Sobes.tech
Назад к вопросам
Senior
14

Как предотвратить овербукинг через PostgreSQL при одновременном бронировании последнего места?

Компании, где спрашивали
СБК ПАРУС

Ответ от нейросети

sobes.tech AI

Чтобы предотвратить овербукинг (бронирование одного и того же последнего места несколькими пользователями одновременно) в PostgreSQL, можно использовать несколько подходов:

  1. Транзакции с уровнем изоляции SERIALIZABLE — гарантируют, что транзакции выполняются последовательно, предотвращая конфликтные изменения.

  2. Блокировки строк (SELECT ... FOR UPDATE) — при попытке забронировать место, сначала блокируем соответствующую запись, чтобы другие транзакции ждали завершения текущей.

  3. Уникальные ограничения и проверка доступности — например, хранить статус места и при бронировании проверять, что оно свободно, обновляя статус в одной транзакции.

Пример с использованием блокировки строк:

BEGIN;
-- Блокируем запись с местом для обновления
SELECT * FROM seats WHERE seat_id = :seat_id AND status = 'available' FOR UPDATE;

-- Если запись найдена, обновляем статус
UPDATE seats SET status = 'booked' WHERE seat_id = :seat_id;

COMMIT;

Если два запроса одновременно попытаются забронировать одно место, второй будет ждать, пока первый не завершится, и если место уже забронировано, обновление не произойдёт.

Также важно обрабатывать ошибки и повторять попытки бронирования при конфликте транзакций.