sql >> Database >  >> RDS >> Mysql

Zet MySQL query's in de wachtrij?

VRAGEN WORDEN NIET ALTIJD PARALLEL UITGEVOERD

Het hangt af van de database-engine. Met MyISAM krijgt bijna elke query een vergrendeling op tabelniveau, wat betekent dat de query's opeenvolgend als een wachtrij worden uitgevoerd. Met de meeste andere motoren kunnen ze parallel lopen.

echo_me zegt nothing happens at the exact same time and a CPU does not do everything at once

Dat is niet helemaal waar. Het is mogelijk dat een DBMS kan draaien op een machine met meer dan één cpu en met meer dan één netwerkinterface. Het is zeer onwaarschijnlijk dat 2 queries tegelijkertijd zouden kunnen aankomen - maar niet onmogelijk, daarom is er een mutex om ervoor te zorgen dat de paring/execution-overgang alleen als een enkele thread wordt uitgevoerd (van uitvoering - niet noodzakelijk hetzelfde lichtgewicht proces).

Er zijn 2 benaderingen voor het oplossen van gelijktijdige DML - ofwel om transacties te gebruiken (waarbij elke gebruiker in feite een kloon van de database krijgt) en wanneer de query's zijn voltooid, probeert de DBMS eventuele wijzigingen te verzoenen - als de afstemming mislukt, draait het DBMS een van de de query's en meldt deze als mislukt. De andere benadering is om vergrendeling op rijniveau te gebruiken - het DBMS identificeert de rijen die zullen worden bijgewerkt door een query en markeert ze als gereserveerd voor update (andere gebruikers kunnen de originele versie van elke rij lezen, maar elke poging om de gegevens bij te werken zal worden geblokkeerd totdat de rij weer beschikbaar is).

Uw probleem is dat u twee mysql-clients heeft, die elk het feit hebben opgehaald dat er nog één item op voorraad is. Dit wordt verder bemoeilijkt door het feit dat (omdat u PHP noemt) de voorraadniveaus mogelijk zijn opgehaald in een andere DBMS-sessie dan de daaropvolgende voorraadaanpassing - u kunt geen transactie hebben die meer dan HTTP-verzoek omvat. Daarom moet u elk feit dat buiten het DBMS wordt bijgehouden binnen een enkele transactie opnieuw valideren.

Optimistische vergrendeling kan een pseudo-transactiecontrolemechanisme creëren - u markeert een record dat u op het punt staat te wijzigen met een tijdstempel en de gebruikersidentificatie (met PHP is de PHP-sessie-ID een goede keuze) - als u het gaat wijzigen, iets anders heeft gewijzigd, dan weet uw code dat de eerder opgehaalde gegevens ongeldig zijn. Dit kan echter tot andere complicaties leiden.



  1. Ontvang de huidige bijgewerkte kolomnaam om in een trigger te gebruiken

  2. Alternatief voor Intersect in MySQL

  3. Versleutel wachtwoord in insert-instructie in postgresql geeft een fout (noodzaak om expliciete typecast toe te voegen)

  4. VBA-basisklasse en afgeleid object-2