Denken Sie daran, ein Ticket für einen Film zu buchen. Es gibt x Anzahl der offenen Plätze, wenn Sie auf die Website kommen, möchte ich einen der Plätze für einen bestimmten Zeitraum reservieren.Reservieren eines Theaterplatzes
Ich habe eine private interne API und eine öffentliche API. Die öffentliche API würde auf die Anwendung reagieren, die versucht, einen Sitzplatz zu reservieren, indem sie die interne API aufruft und diesen Platz dann in einen "Being Booked" Status setzt.
Mein Problem ist, dass ich gelegentlich zwei Personen den gleichen Platz buchen, und das führt dazu, dass eine Person alle ihre Informationen eingeben, und dann nicht in der Lage, ihre Registrierung zu beenden.
Ich habe versucht, meinen Code Thread sicher zu machen, aber immer noch die ungerade doppelte Zuordnung des gleichen Sitzes.
Ich rufe meinen Status-Update von meiner "Reserve" Methode als solche:
VisitStatusChangeResult visit_status_change_result = await ReserveSlotByLockedStatusUpdate(first_empty_seat);
dies ist die Status-Update-Methode, die ich versucht habe durch die Verwendung SemaphoreSlim Thread saftey hinzuzufügen:
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();
}
}
Fehle ich etwas, wo sogar mit dem SemaphoreSlim zwei Leute auf dem gleichen Platz sitzen können?
Speichern Sie Reservierungsinformationen in der Datenbank? Wenn ja, warum ist es (auf Datenbankebene) möglich, dass eine solche Situation eintritt? – Evk
Ja, die Plätze sind jeweils eine Zeile in einer Datenbank mit einem fk von 'VisitStatusID', was auf" BeingBooked "eingestellt ist, also wissen wir, dass Platz reserviert ist, bis der Kunde den Platz reserviert hat, den Buchungsantrag verlässt, oder sie keine Zeit mehr haben. – Mark