sql >> Database >  >> RDS >> Mysql

MySql Logic-optimalisatie

Het probleem is dat u MySQL-niveauvergrendeling probeert te gebruiken om ervoor te zorgen dat een ticket niet aan meer dan één persoon kan worden toegewezen. Op deze manier is er geen manier om te detecteren of een ticket is vergrendeld door een gebruiker.

Ik zou een vergrendeling op applicatieniveau implementeren door 2 vergrendelingsgerelateerde velden toe te voegen aan de ticketstabel:een tijdstempel wanneer de vergrendeling werd toegepast en een gebruikers-ID-veld dat aangeeft welke gebruiker de vergrendeling heeft. De vergrendelingsgerelateerde velden kunnen in een andere tabel worden bewaard (winkelwagentje kan bijvoorbeeld voor dit doel worden gebruikt).

Wanneer een gebruiker een ticket selecteert, probeert u deze vergrendelingsvelden bij te werken met een voorwaardelijke update-verklaring:

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

Waarden in plaats van ... worden geleverd door uw toepassing. lock_time is null criteria zijn er om ervoor te zorgen dat als het ticket al door een andere gebruiker is geselecteerd, de latere gebruiker de vergrendeling niet opheft. Controleer na de update-instructie het aantal betrokken rijen. Als het er een is, heeft de huidige gebruiker het slot verkregen. Als het 0 is, heeft iemand anders het ticket geblokkeerd.

Als je de vergrendelingsgegevens in een andere tabel hebt, plaats dan een unieke beperking op het ticket-ID-veld in die tabel en gebruik insert om een ​​slot te verkrijgen. Als het invoegen lukt, wordt het slot verkregen. Als het mislukt, heeft een andere gebruiker het ticket vergrendeld.

De vergrendeling wordt meestal een aantal minuten vastgehouden, daarna moet uw toepassing de vergrendeling deactiveren (vergrendelvelden op nul zetten of de vergrendelingsrecord uit de andere tabel verwijderen).




  1. Cachegegevens in PHP SESSION, of elke keer opvragen vanuit db?

  2. Hoe cluster-40926 uit mijn dataroot in moodle te verwijderen

  3. Hoe gemeenschappelijke records in dezelfde databasetabel op te halen via een enkele SQL-query?

  4. Neo4j - Maak een index met Cypher