Middle+
54
Hoe implementeer je een reserveringssysteem voor zitplaatsen in een bioscoop zonder dubbele verkoop? Welke soort blokkering moet je kiezen?
Bedrijven waar gevraagd werd
Antwoord van AI
sobes.tech AI
Для системы бронирования мест в кинотеатре ключевая задача — избежать двойного бронирования одного и того же места. Для этого нужно обеспечить атомарность операции бронирования и корректную синхронизацию доступа к данным.
Тип блокировки:
- В большинстве случаев подходит оптимистичная блокировка с использованием версии записи (versioning) или временной метки (timestamp). Это позволяет избежать блокировок на длительное время и повысить производительность.
- Если ожидается высокая конкуренция за одни и те же места, можно использовать пессимистическую блокировку на уровне транзакции (например,
SELECT ... FOR UPDATE), чтобы заблокировать запись о месте на время бронирования.
Пример подхода с оптимистичной блокировкой:
- При загрузке информации о месте клиент получает текущую версию записи.
- При попытке бронирования отправляется запрос с указанием версии.
- В базе проверяется, что версия не изменилась с момента чтения.
- Если версия совпадает, бронирование подтверждается, версия увеличивается.
- Если версия изменилась — операция откатывается, клиенту предлагается повторить попытку.
Пример SQL с пессимистической блокировкой:
BEGIN TRANSACTION;
SELECT * FROM seats WHERE seat_id = ? AND show_id = ? FOR UPDATE;
-- Проверить, свободно ли место
-- Если свободно, обновить статус на забронировано
COMMIT;
В Java с использованием JPA можно использовать аннотацию @Version для оптимистичной блокировки или явно управлять транзакциями и блокировками через EntityManager.
Таким образом, выбор блокировки зависит от нагрузки и требований к производительности, но оптимистичная блокировка часто является предпочтительной для систем бронирования.