Allt beror på ISOLATION LEVEL
du har ställt in.
Du kan se vilken du har ställt in med den här frågan:
select @@global.tx_isolation, @@session.tx_isolation;
Innan jag förklarar de olika isoleringsnivåerna, låt mig förklara vilka problem de försöker undvika:
-
Den smutsiga läsningen :Data för en ännu inte avslutad transaktion läses av en annan transaktion.
-
Den förlorade uppdateringen :Två transaktioner ändrar en post i en tabell parallellt. När båda transaktionerna är klara tillämpas endast en ändring.
-
Den icke-repeterbara läsningen :Återkommande läsningar leder till olika resultat.
-
fantomläsningen :Under en transaktion lägger en annan transaktion till eller tar bort tabellposter.
Nu till de olika isoleringsnivåerna.
Läs oengagerad :
Med denna isoleringsnivå ignorerar läsoperationer alla typer av lås, därför kan något av de ovan nämnda problemen uppstå.
Läs engagerad :
Denna isoleringsnivå sätter ett skrivlås för hela transaktionen på objekt som bör modifieras. Läslås ställs endast in vid läsning av data. Därför kan icke-repeterbar läsning och fantomläsning förekomma.
Repeterbar läsning :
Med denna isoleringsnivå säkerställs att återkommande läsoperationer alltid ger samma resultat när parametrarna är desamma. Lås är inställda för läs- och skrivoperationer under transaktionens totala varaktighet. Därför kan endast fantomläsningar förekomma.
Serialiserbar :
Den högsta isoleringsnivån garanterar att resultatet av parallellt löpande transaktioner är detsamma som om transaktionerna skulle köras en efter en. De flesta databaser kör inte riktigt dessa transaktioner en efter en, det skulle vara för mycket av en prestandaförlust. Därför kan det hända att en transaktion avbryts. MySQL inser till exempel detta med MVCC (Multi-Version Concurrency Control). Googla om du vill veta mer. Det är för mycket för det här svaret.
Sammantaget förklarar den här tabellen det också:
| 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
- I denna manuella post är lite mer information om det och hur man ställer in isoleringsnivån.
Allt detta är bara teori för relationsdatabashanteringssystem. Eftersom MySQL använder MVCC (multiversion concurrency control) förekommer dock fantomläsningar inte när man använder InnoDB och repeterbar läsisoleringsnivå .
Från manual
: