saimanisha Ответов: 1

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


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

Что я уже пробовал:

я думал, что он использует концепцию блокировки, так как я не очень хорошо знаком с такого рода сценариями .

Ziee-M

На самом деле это ситуация параллелизма. Параллелизм возникает, когда несколько транзакций пытаются обновить одну и ту же строку/данные.
Исключение будет вызвано, если вы упадете в этом случае, и вам придется обработать это исключение, чтобы разрешить ситуацию.
Я не могу дать вам больше подробностей, потому что это полностью зависит от инструментов, которые вы используете для доступа к своей базе данных (EnityFrame, ADO.net-да...)
Каждый из них обрабатывает параллелизм по-разному.
Всего несколько поисков с ключевым словом concurrency, и вы найдете множество ответов.

1 Ответов

Рейтинг:
4

F-ES Sitecore

Запись для места в базе данных должна иметь какое-то поле "locked at". Когда кто-то нажимает кнопку "забронировать", он обновляет поле "заблокировано в" с текущим временем. Если кто-то другой пытается забронировать место с ненулевым заблокированным временем, ему говорят, что его бронирует кто-то другой. Когда пользователь отменяет бронирование, а затем очищает это поле, вы также можете очистить его при бронировании. Хитрость заключается в том, что вам тогда понадобится какая-то форма автоматизированной задачи (SQL agent, запланированная задача, служба windows, синхронизированное событие и т. д.), которая очищает блокировки, которые закончились, скажем, 10 минут назад, и предполагает, что бронирование было просто отменено.


Ziee-M

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

F-ES Sitecore

Альтернатива состоит в том, чтобы позволить другим пользователям пройти через этот 7-минутный процесс просто для того, чтобы в последнюю секунду им сказали, что место занял кто-то другой. Затем они могут искать другое место, и произойдет то же самое, поэтому просто откажитесь от вашего сайта вообще.

Ziee-M

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