Sobes.tech
Назад к вопросам
Middle+
5

Как реализовать систему бронирования мест в кинотеатре без двойных продаж? Какой тип блокировки выбрать?

Компании, где спрашивали
ИннотехИннотех

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

sobes.tech AI

Для системы бронирования мест в кинотеатре ключевая задача — избежать двойного бронирования одного и того же места. Для этого нужно обеспечить атомарность операции бронирования и корректную синхронизацию доступа к данным.

Тип блокировки:

  • В большинстве случаев подходит оптимистичная блокировка с использованием версии записи (versioning) или временной метки (timestamp). Это позволяет избежать блокировок на длительное время и повысить производительность.
  • Если ожидается высокая конкуренция за одни и те же места, можно использовать пессимистическую блокировку на уровне транзакции (например, SELECT ... FOR UPDATE), чтобы заблокировать запись о месте на время бронирования.

Пример подхода с оптимистичной блокировкой:

  1. При загрузке информации о месте клиент получает текущую версию записи.
  2. При попытке бронирования отправляется запрос с указанием версии.
  3. В базе проверяется, что версия не изменилась с момента чтения.
  4. Если версия совпадает, бронирование подтверждается, версия увеличивается.
  5. Если версия изменилась — операция откатывается, клиенту предлагается повторить попытку.

Пример SQL с пессимистической блокировкой:

BEGIN TRANSACTION;
SELECT * FROM seats WHERE seat_id = ? AND show_id = ? FOR UPDATE;
-- Проверить, свободно ли место
-- Если свободно, обновить статус на забронировано
COMMIT;

В Java с использованием JPA можно использовать аннотацию @Version для оптимистичной блокировки или явно управлять транзакциями и блокировками через EntityManager.

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