Назад к вопросам
Иннотех
Middle+
5
Как реализовать систему бронирования мест в кинотеатре без двойных продаж? Какой тип блокировки выбрать?
Компании, где спрашивали
Ответ от нейросети
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.
Таким образом, выбор блокировки зависит от нагрузки и требований к производительности, но оптимистичная блокировка часто является предпочтительной для систем бронирования.