Sobes.tech
Back to questions
Senior
13

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

Companies where asked
СБК ПАРУС

Answer from AI

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;

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

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