Dans la salle de cinéma où je vais, ils ont des kiosques à billets qui vous permettent de sélectionner les sièges que vous voulez; ils ont également un site Web qui fait la même chose (le site Web a également un compte à rebours de 30 secondes dans lequel vous devez choisir un siège).
Bien que je comprenne des choses telles que les transactions de base de données et d'autres techniques permettant de gérer plusieurs utilisateurs simultanés, je ne comprends tout simplement pas comment plusieurs personnes peuvent être autorisées à sélectionner un siège en même temps; Est-ce aussi simple que le premier à appuyer sur ACHETER obtient les sièges et l'autre personne recevra un message d'erreur, ou est-ce que je manque quelque chose?
concurrency
Mbwasi
la source
la source
Réponses:
Pour ce faire, la méthode classique consiste à utiliser une base de données transactionnelle (afin d'éviter tout conflit) et à vous attribuer provisoirement le siège qui expire après un certain temps (par exemple 10 minutes pour les kiosques) qui vous laisse suffisamment de temps pour Payer. Si la transaction (visible par le client) échoue ou expire, l'attribution de sièges peut être libérée dans le pool. (Toutes les modifications d'état sont traitées via la base de données transactionnelle, et une transaction visible par le client peut nécessiter de nombreuses transactions au niveau de la base de données.)
Les compagnies aériennes utiliseront un système similaire (bien que beaucoup plus complexe en raison de la nécessité de gérer plusieurs vols!) Pour réserver des sièges en ligne. J'imagine que le délai d'attente serait considérablement plus long; les billets d'avion sont généralement réservés plus loin que les billets de cinéma, et sont également plus chers.
la source
Les 30 secondes que vous avez vues sont souvent plus proches de 15 minutes. Je ne crois pas qu'il y ait une transaction de base de données active pour cette durée.
Si je devais concevoir un tel système, voici comment je le ferais: avoir les objets métier
Booking
etReservation
. Les réservations sont essentiellement des réservations confirmées (c'est-à-dire payées). Je voudrais les stocker dans la même table de base de données et distinguer par un attribut ou deux.Lors de la recherche de places disponibles, vous devez interroger à la fois les réservations et les réservations.
Lorsque quelqu'un sélectionne un siège, vous créez une nouvelle réservation, montrant ainsi à d'autres clients le siège tel qu'il est pris. Une deuxième réservation pour le même siège sera refusée - la mise à jour ou l'insertion de la base de données échouera. Si le client confirme / paie pour la réservation, vous la passez en réservation. Dans un travail par lots périodique, vous supprimez toutes les réservations de plus de 15 minutes (ou l'heure que vous donnez à vos clients).
la source
Cela va avec la propriété ACID de la base de données - Isolation. La base de données utilise des verrous sur les données pour éviter toute modification simultanée des données.
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
la source
Il y a au moins deux processus opérationnels impliqués ici.
Afficher les places disponibles.
Réservez une place choisie.
Étant donné que ces processus ne se succèdent pas de manière immodérée et que deux personnes peuvent choisir le même siège, le problème de la simultanéité se pose.
Si votre conception de base de données assigne la contrainte d'unicité correcte afin que la combinaison de:
-TheaterID
-SID
-EventID
sont uniques, la base de données empêchera les doublons.
Le scénario suivant est également possible mais sera pris en charge par la mise en œuvre suggérée ci-dessus:
En supposant qu'une vue de grille disponible pour un théâtre donné et un événement donné puisse être affichée:
Donc, tout ce que vous devez faire peut ne rien être de plus une conception de base de données correcte et un choix approprié de contraintes.
D'autres approches plus complexes sont possibles si vous le souhaitez, en utilisant des files d'attente de transactions. Dans ce cas, les demandes sont d'abord écrites dans une file d'attente, puis un processus est lancé toutes les n secondes, mais cela n'est guère nécessaire ou pratique dans votre cas.
La partie la plus intéressante est ce que la grille de liste pour l’utilisateur 1 devrait afficher.
la source
Vous pouvez éviter la situation de concurrence critique si vous retardez l'attribution de sièges spécifiques.
la source