sql >> Databasteknik >  >> RDS >> Mysql

Står MySQL i kö?

FRÅGOR KÖR INTE ALLTID PARALLELLT

Det beror på databasmotorn. Med MyISAM får nästan varje fråga ett lås på tabellnivå, vilket innebär att frågorna körs sekventiellt som en kö. Med de flesta andra motorer kan de köras parallellt.

echo_me säger att nothing happens at the exact same time and a CPU does not do everything at once

Det är inte riktigt sant. Det är möjligt att en DBMS kan köras på en maskin med mer än en cpu och med mer än ett nätverksgränssnitt. Det är mycket osannolikt att 2 frågor kan komma samtidigt - men inte omöjligt, därför finns det en mutex för att säkerställa att paring/exekveringsövergången bara körs som en enda tråd (av exekvering - inte nödvändigtvis samma lättviktsprocess).

Det finns två sätt att lösa samtidig DML - antingen att använda transaktioner (där varje användare effektivt får en klon av databasen) och när frågorna har slutförts försöker DBMS stämma av eventuella ändringar - om avstämningen misslyckas, rullar DBMS tillbaka en av frågorna och rapporterar det som misslyckat. Det andra tillvägagångssättet är att använda radnivålåsning - DBMS identifierar raderna som kommer att uppdateras av en fråga och markerar dem som reserverade för uppdatering (andra användare kan läsa den ursprungliga versionen av varje rad men varje försök att uppdatera data kommer att blockerad tills raden är tillgänglig igen).

Ditt problem är att du har två mysql-klienter, som var och en har hämtat det faktum att det finns en vara i lager kvar. Detta kompliceras ytterligare av det faktum att (eftersom du nämner PHP) lagernivåerna kan ha hämtats i en annan DBMS-session än den efterföljande lagerjusteringen - du kan inte ha en transaktion som sträcker sig över mer än HTTP-förfrågan. Därför måste du återvalidera alla fakta som upprätthålls utanför DBMS inom en enda transaktion.

Optimistisk låsning kan skapa en pseudo - transaktionskontrollmekanism - du flaggar en post som du håller på att ändra med en tidsstämpel och användaridentifieraren (med PHP är PHP-sessions-ID ett bra val) - om när du kommer att ändra det, något annat har ändrat det, då vet din kod att data den hämtade tidigare är ogiltig. Detta kan dock leda till andra komplikationer.



  1. Bästa sättet att samla in och sedan importera data till drupal?

  2. Hur modellerar man effektivt arv i en databas?

  3. Kontrollera om en användardefinierad typ redan finns i PostgreSQL

  4. MySQL:Transaktioner över flera trådar