Здесь задействованы как минимум 2 бизнес-процесса.
Показать доступные места.
Забронируйте выбранное место.
Поскольку эти процессы не следуют друг за другом неумеренно, и поскольку 2 человека могут выбрать одно и то же место, возникает проблема параллелизма.
Если ваш дизайн базы данных назначает правильное ограничение уникальности, чтобы комбинация:
-TheaterID
-SeatID
-EventID
являются уникальными, то база данных будет предотвращать дубликаты.
Следующий сценарий также возможен, но будет учтен вышеупомянутой предложенной реализацией:
Предполагая, что отображение сетки доступно для данного театра и данного события, может быть отображено:
- Пользователь1 отображает доступные места (и получает места 1 и 2)
- Пользователь2 отображает доступные места (и получает места 1 и 2)
- Пользователь1 немного разговаривает с клиентом по телефону
- Пользователь 2 идет и заказывает место 2 для своего клиента
- Пользователь1 пытается забронировать место 2 для своего клиента (потому что оно показывает, как доступно на его экране)
- Уникальный индекс не позволяет шагу 5 коммутировать данные.
Таким образом, все, что вам нужно сделать, это не более правильный дизайн базы данных и правильный выбор ограничений.
Другие более сложные подходы возможны, если вы хотите, используя очереди транзакций. В этом случае запросы сначала записываются в очередь, а затем запускают процесс каждые n секунд, но это вряд ли необходимо или практично в вашем случае.
Действительно интересная часть - что должна показать сетка списка для пользователя 1?