sql >> Database teknologi >  >> RDS >> Mysql

MySql Logic Optimering

Problemet er, at du forsøger at bruge MySQL-niveaulåsning for at sikre, at en billet ikke kan tildeles mere end én person. På denne måde er der ingen måde at opdage, om en billet er låst af en bruger.

Jeg ville implementere en applikationsniveaulås ved at tilføje 2 låserelaterede felter til billettabellen:et tidsstempel, hvornår låsen blev anvendt, og et bruger-id-felt, der fortæller dig, hvilken bruger der har låsen. De låserelaterede felter kan opbevares i et andet bord (indkøbskurv kan f.eks. bruges til dette formål).

Når en bruger vælger en billet, så forsøger du at opdatere disse låsefelter med en betinget opdateringserklæring:

update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null

Værdier i stedet for ... leveres af din ansøgning. lock_time is null kriterier er der for at sikre, at hvis billetten allerede er valgt af en anden bruger, så tilsidesætter den senere bruger ikke låsen. Efter opdateringserklæringen skal du tjekke antallet af berørte rækker. Hvis det er en, har den nuværende bruger erhvervet låsen. Hvis det er 0, så har en anden låst billetten.

Hvis du har låsedataene i en anden tabel, skal du placere en unik begrænsning på billet-id-feltet i den tabel og bruge insert til at erhverve en lås. Hvis indsatsen lykkes, er låsen erhvervet. Hvis det mislykkes, så har en anden bruger låst billetten.

Låsen holdes normalt i et antal minutter, hvorefter din applikation skal frigive låsen (indstil låsefelter til at nulstille eller slet låseposten fra den anden tabel).




  1. MySQL INSERT uden at skulle angive alle ikke-standardfelter (#1067 - Ugyldig standardværdi for 'tabel')

  2. Sequelize Query for at finde alle poster, der falder inden for datointervallet

  3. gem install mysql:Kunne ikke bygge gem native extension (Mac Lion)

  4. Angivelse af kolonnealias med brugerdefineret variabel