В кинотеатре я иду к билетным киоскам, которые позволяют вам выбрать нужные места; у них также есть веб-сайт, который делает то же самое (веб-сайт также имеет таймер обратного отсчета около 30 секунд, в течение которого вы должны выбрать место).
Хотя я понимаю такие вещи, как транзакции с базой данных и другие методы работы с несколькими одновременными пользователями, я просто не могу понять, как нескольким людям может быть разрешено выбирать место одновременно; это так же просто, как первый, кто нажмет «КУПИТЬ», получит места, а другой получит сообщение об ошибке, или я что-то упустил?
concurrency
mbwasi
источник
источник
Ответы:
Классический метод сделать это - использовать транзакционную базу данных (чтобы не было конфликтов) и предварительно назначить место, срок действия которого истекает через некоторое время (например, 10 минут для киосков), что дает вам достаточно времени для платить. Если транзакция (видимая клиенту) проваливается или истекает время ожидания, распределение мест может быть возвращено обратно в пул. (Все изменения состояния обрабатываются через транзакционную базу данных, и для одной видимой для клиента транзакции может потребоваться много транзакций на уровне базы данных.)
Авиакомпании будут использовать аналогичную систему (хотя и гораздо более сложную из-за необходимости обрабатывать несколько этапов полета!) Для бронирования мест онлайн. Я полагаю, что время ожидания будет значительно больше; авиабилеты обычно бронируются заранее, чем билеты в кино, а также стоят дороже.
источник
30 секунд, которые вы видели в наши дни, часто больше похожи на 15 минут. Я не верю, что транзакция базы данных активна в течение этого периода.
Если бы я проектировал такую систему, я бы так и сделал: имел бизнес-объекты
Booking
и тReservation
. Д. Бронирование по существу подтверждено (т.е. оплачено) бронирования. Я хотел бы хранить их в одной таблице БД и различать по атрибуту или двум.Выбирая свободные места, вы запрашиваете как бронирование, так и бронирование.
Когда кто-то выбирает место, вы создаете новое бронирование, таким образом показывая другим клиентам место, занятое. Второе бронирование для того же места будет отклонено - обновление БД или вставка не удастся. Если клиент подтверждает / оплачивает бронирование, вы переходите к бронированию. В периодическом пакетном задании вы удаляете все резервирования старше 15 минут (или в любое другое время, которое вы предоставляете своим клиентам).
источник
Это идет со свойством базы данных ACID - Изоляция. База данных использует блокировки данных, чтобы избежать одновременного изменения данных.
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
источник
Здесь задействованы как минимум 2 бизнес-процесса.
Показать доступные места.
Забронируйте выбранное место.
Поскольку эти процессы не следуют друг за другом неумеренно, и поскольку 2 человека могут выбрать одно и то же место, возникает проблема параллелизма.
Если ваш дизайн базы данных назначает правильное ограничение уникальности, чтобы комбинация:
-TheaterID
-SeatID
-EventID
являются уникальными, то база данных будет предотвращать дубликаты.
Следующий сценарий также возможен, но будет учтен вышеупомянутой предложенной реализацией:
Предполагая, что отображение сетки доступно для данного театра и данного события, может быть отображено:
Таким образом, все, что вам нужно сделать, это не более правильный дизайн базы данных и правильный выбор ограничений.
Другие более сложные подходы возможны, если вы хотите, используя очереди транзакций. В этом случае запросы сначала записываются в очередь, а затем запускают процесс каждые n секунд, но это вряд ли необходимо или практично в вашем случае.
Действительно интересная часть - что должна показать сетка списка для пользователя 1?
источник
Вы можете избежать условий гонки, если откладываете распределение определенных мест.
источник