Подумайте, закажите билет в кино. Есть x количество открытых мест, когда вы приходите на сайт, я хочу зарезервировать одно из мест в течение определенного периода времени.Резервирование A Theatre Seat
У меня есть частный внутренний API и общедоступный API. Открытый API ответит на приложение, которое хочет зарезервировать место, позвонив по внутреннему API и затем разместив это место в статусе «Будущее забронировано».
Моя проблема заключается в том, что я иногда два человека заказывал одно и то же место, и это приводит к тому, что один человек вводит всю свою информацию, а затем не может завершить регистрацию.
Я попытался сделать код безопасным, но я все еще получаю нечетное дублирующее присвоение того же места.
Я звоню мой статус обновления от моего метода «Резерв» как таковой:
VisitStatusChangeResult visit_status_change_result = await ReserveSlotByLockedStatusUpdate(first_empty_seat);
это метод обновления статуса, который я пытался добавить нить Техника безопасности в помощью SemaphoreSlim:
private static SemaphoreSlim m_ReserveOnlineSlotStatusUpdateSemaphore = new SemaphoreSlim(initialCount: 1, maxCount: 1);
private async Task<VisitStatusChangeResult> ReserveSlotByLockedStatusUpdate(VisitQueryResult first_empty_seat)
{
await m_ReserveOnlineSlotStatusUpdateSemaphore.WaitAsync();
try
{
return await ChangeStatus(new VisitStatusUpdateModel
{
VisitID = first_empty_seat.ID,
CurrentVisitStatusID = first_empty_online_visit.VisitStatusID,
NewVisitStatusID = (int)VisitStatuses.BeingBooked
});
}
finally
{
m_ReserveOnlineSlotStatusUpdateSemaphore.Release();
}
}
Я пропустил что-то, где даже с SemaphoreSlim ждут, у меня могут быть два человека, хватающих одно и то же место?
Вы сохраняете информацию о резервировании в базе данных? Если да, то почему это разрешено (на уровне базы данных) для такой ситуации? – Evk
Да, места каждая представляют собой строку в базе данных с fk из 'VisitStatusID', для которой установлено значение« Бытие », поэтому мы знаем, что место зарезервировано до тех пор, пока клиент не забронирует место, не покинет заявку на бронирование, или они не хватит времени. – Mark