Vše závisí na ISOLATION LEVEL
jste nastavili.
Pomocí tohoto dotazu můžete zjistit, který z nich jste nastavili:
select @@global.tx_isolation, @@session.tx_isolation;
Než vysvětlím různé úrovně izolace, dovolte mi vysvětlit, kterým problémům se snaží vyhnout:
-
Nečisté čtení :Data dosud nedokončené transakce jsou čtena jinou transakcí.
-
Ztracená aktualizace :Dvě transakce paralelně upravují položku v tabulce. Po dokončení obou transakcí se použije pouze jedna úprava.
-
Neopakovatelné čtení :Opakované čtení vede k různým výsledkům.
-
Fantomové čtení :Během transakce další transakce přidává nebo odstraňuje položky tabulky.
Nyní k různým úrovním izolace.
Číst bez závazku :
S touto úrovní izolace operace čtení ignorují jakýkoli druh zámků, proto může nastat kterýkoli z výše uvedených problémů.
Číst odevzdáno :
Tato úroveň izolace nastavuje zámek zápisu pro celou transakci u objektů, které by měly být změněny. Zámky čtení se nastavují pouze při čtení dat. Proto může dojít k neopakovatelnému čtení a fantomovému čtení.
Opakovatelné čtení :
S touto úrovní izolace je zajištěno, že opakované operace čtení vždy přinášejí stejný výsledek, když jsou parametry stejné. Zámky jsou nastaveny pro operace čtení a zápisu po celou dobu trvání transakce. Proto může docházet pouze k fiktivnímu čtení.
Serializovatelný :
Nejvyšší stupeň izolace zaručuje, že výsledek paralelně běžících transakcí je stejný, jako kdyby transakce probíhaly jedna po druhé. Většina databází skutečně neprovádí tyto transakce jednu po druhé, byla by to příliš velká ztráta výkonu. Proto se může stát, že se jedna transakce přeruší. MySQL to například realizuje pomocí MVCC (Multi-Version Concurrency Control). Vygooglujte, pokud chcete vědět více. Na tuto odpověď je toho příliš.
Celkově tato tabulka to také vysvětluje:
| Lost updates | Dirty Read | Non-Repeatable Read | Phantom Read
---------------------------------------------------------------------------------
Read Uncommitted | possible | possible | possible | possible
Read Committed | impossible | impossible | possible | possible
Repeatable Read | impossible | impossible | impossible | possible
Serializable | impossible | impossible | impossible | impossible
- V tomto příručce je několik dalších informací o tom a jak nastavit úroveň izolace.
To vše je pouze teorie pro systémy správy relačních databází. Protože však MySQL používá MVCC (kontrola souběžnosti více verzí), při použití InnoDB a opakovatelné úrovně izolace čtení nedochází k fantomovému čtení .
Z ručně
: