sql >> Databáze >  >> RDS >> Mysql

Zařazuje MySQL dotazy do fronty?

DOTAZY NEVŽDY PROBÍHAJÍ PARALELNĚ

Záleží na databázovém stroji. S MyISAM získá téměř každý dotaz zámek na úrovni tabulky, což znamená, že dotazy jsou spouštěny postupně jako fronta. S většinou ostatních motorů mohou běžet paralelně.

echo_me říká nothing happens at the exact same time and a CPU does not do everything at once

To není tak úplně pravda. Je možné, že DBMS může běžet na počítači s více než jedním procesorem as více než jedním síťovým rozhraním. Je to velmi je nepravděpodobné, že by mohly dorazit 2 dotazy současně – ale není to nemožné, proto existuje mutex, který zajistí, že přechod párování/spouštění běží pouze jako jediné vlákno (provádění – nemusí to být nutně stejný lehký proces).

Existují 2 přístupy k řešení souběžného DML – buď použít transakce (kde každý uživatel efektivně získá klon databáze), a když jsou dotazy dokončeny, DBMS se pokusí sladit jakékoli změny – pokud se sladění nezdaří, pak DBMS vrátí jednu z dotazy a hlásí to jako neúspěšné. Druhým přístupem je použití zamykání na úrovni řádků - DBMS identifikuje řádky, které budou aktualizovány dotazem, a označí je jako vyhrazené pro aktualizaci (ostatní uživatelé si mohou přečíst původní verzi každého řádku, ale jakýkoli pokus o aktualizaci dat bude zablokován, dokud nebude řádek znovu dostupný).

Váš problém je, že máte dva mysql klienty, z nichž každý získal skutečnost, že zbývá jedna položka na skladě. To je dále komplikováno skutečností, že (protože zmiňujete PHP), zásoby mohly být načteny v jiné relaci DBMS než následná úprava zásob - nemůžete mít transakci přesahující požadavek HTTP. Proto musíte v rámci jedné transakce znovu ověřit jakoukoli skutečnost udržovanou mimo DBMS.

Optimistické zamykání může vytvořit pseudo - transakční kontrolní mechanismus - označíte záznam, který se chystáte upravit, časovým razítkem a identifikátorem uživatele (s PHP je ID relace PHP dobrou volbou) - když ho chcete upravit, něco jiného změnil, pak váš kód ví, že dříve načtená data jsou neplatná. To však může vést k dalším komplikacím.



  1. Získejte první, druhé, třetí nebo čtvrté pondělí v měsíci v SQLite

  2. SQL / Doctrine:Problém s připojením vlevo

  3. Upřednostněte jeden sloupec před druhým

  4. funkce listunagg?