Как предотвратить овербукинг через PostgreSQL при одновременном бронировании последнего места?
Answer from AI
sobes.tech AI
Чтобы предотвратить овербукинг (бронирование одного и того же последнего места несколькими пользователями одновременно) в PostgreSQL, можно использовать несколько подходов:
-
Транзакции с уровнем изоляции SERIALIZABLE — гарантируют, что транзакции выполняются последовательно, предотвращая конфликтные изменения.
-
Блокировки строк (SELECT ... FOR UPDATE) — при попытке забронировать место, сначала блокируем соответствующую запись, чтобы другие транзакции ждали завершения текущей.
-
Уникальные ограничения и проверка доступности — например, хранить статус места и при бронировании проверять, что оно свободно, обновляя статус в одной транзакции.
Пример с использованием блокировки строк:
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;
Если два запроса одновременно попытаются забронировать одно место, второй будет ждать, пока первый не завершится, и если место уже забронировано, обновление не произойдёт.
Также важно обрабатывать ошибки и повторять попытки бронирования при конфликте транзакций.