Im Kino besuche ich sie mit Ticketschaltern, an denen Sie die gewünschten Plätze auswählen können. Sie haben auch eine Website, die das gleiche tut (die Website hat auch einen Countdown-Timer von etwa 30 Sekunden, in dem Sie einen Sitzplatz auswählen müssen).
Ich verstehe zwar Dinge wie Datenbanktransaktionen und andere Techniken für den Umgang mit mehreren gleichzeitigen Benutzern, kann mich aber nicht darauf konzentrieren, wie mehrere Personen gleichzeitig einen Sitzplatz auswählen dürfen. Ist es so einfach, dass die erste Person, die auf KAUF drückt, die Plätze bekommt und die andere Person eine Fehlermeldung erhält, oder fehlt mir etwas?
concurrency
mbwasi
quelle
quelle
Antworten:
Die klassische Methode hierfür besteht darin, eine Transaktionsdatenbank zu verwenden (damit es nicht zu Konflikten kommt) und eine vorläufige Zuordnung des Sitzplatzes zu Ihnen vorzunehmen, die nach einer gewissen Zeitspanne (z. B. 10 Minuten für Kioske) abläuft, für die Sie genügend Zeit haben Zahlen. Wenn die (vom Kunden sichtbare) Transaktion ausfällt oder ein Timeout auftritt, kann die Sitzplatzzuweisung wieder in den Pool freigegeben werden. (Alle Statusänderungen werden über die Transaktionsdatenbank verarbeitet, und für eine vom Kunden sichtbare Transaktion sind möglicherweise viele Transaktionen auf Datenbankebene erforderlich.)
Die Fluggesellschaften werden ein ähnliches System verwenden (obwohl es aufgrund der Notwendigkeit, mehrere Flugstrecken zu bewältigen, sehr viel komplexer ist!), Um Sitzplätze online zu buchen. Ich würde mir vorstellen, dass das Timeout erheblich länger sein würde; Flugtickets werden in der Regel weiter im Voraus gebucht als Kinokarten und sind auch teurer.
quelle
Die 30 Sekunden, die Sie gesehen haben, sind heutzutage oft eher 15 Minuten. Ich glaube nicht, dass für diese Dauer eine Datenbanktransaktion aktiv ist.
Wenn ich ein solches System entwerfen würde, würde ich das folgendermaßen tun: Haben Sie die Geschäftsobjekte
Booking
undReservation
. Buchungen sind im Wesentlichen bestätigte (dh bezahlte) Reservierungen. Ich würde sie in der gleichen DB-Tabelle speichern und durch ein Attribut oder zwei unterscheiden.Wenn Sie freie Plätze abrufen, fragen Sie sowohl Buchungen als auch Reservierungen ab.
Wenn jemand einen Sitzplatz auswählt, erstellen Sie eine neue Reservierung und zeigen anderen Kunden den Sitzplatz als belegt an. Eine zweite Reservierung für denselben Sitz wird abgelehnt - die Aktualisierung oder Einfügung der Datenbank schlägt fehl. Wenn der Kunde die Reservierung bestätigt / bezahlt, wird sie in eine Buchung umgewandelt. In einem periodischen Batch-Job löschen Sie alle Reservierungen, die älter als 15 Minuten sind (oder wann immer Sie Ihren Kunden Zeit geben).
quelle
Dies geht mit der Eigenschaft ACID der Datenbank - Isolation einher. Die Datenbank verwendet Sperren für die Daten, um eine gleichzeitige Änderung der Daten zu vermeiden.
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
quelle
Hier sind mindestens 2 Geschäftsprozesse beteiligt.
Freie Plätze anzeigen.
Buchen Sie einen ausgewählten Sitzplatz.
Da diese Prozesse nicht maßlos aufeinander folgen und 2 Personen denselben Sitzplatz auswählen können, tritt das Problem der Parallelität auf.
Wenn Ihr Datenbankentwurf die korrekte Eindeutigkeitsbedingung zuweist, so dass die Kombination von:
-TheaterID
-SitzID
-EventID
sind eindeutig, dann verhindert die Datenbank Duplikate.
Das folgende Szenario ist ebenfalls möglich, wird jedoch von der oben vorgeschlagenen Implementierung berücksichtigt:
Angenommen, es kann eine Rasteransicht der für ein bestimmtes Theater und ein bestimmtes Ereignis verfügbaren Elemente angezeigt werden:
Alles, was Sie tun müssen, ist möglicherweise nichts mehr korrektes Datenbankdesign und die richtige Auswahl von Einschränkungen.
Andere komplexere Ansätze sind möglich, wenn Sie Transaktionswarteschlangen verwenden möchten. In diesem Fall werden Anforderungen zuerst in eine Warteschlange geschrieben und dann alle n Sekunden ein Prozess ausgelöst. Dies ist in Ihrem Fall jedoch kaum erforderlich oder praktisch.
Der wirklich interessante Teil ist, was das Listenraster für Benutzer 1 anzeigen soll.
quelle
Sie können die Rennbedingung umgehen, wenn Sie die Zuteilung bestimmter Plätze verzögern.
quelle