Från Wikipedia (som har bra och detaljerade exempel på detta):
En icke-repeterbar läsning inträffar när en rad under en transaktions gång hämtas två gånger och värdena inom raden skiljer sig åt mellan läsningarna.
och
En fantomläsning inträffar när två identiska frågor exekveras under en transaktion, och samlingen av rader som returneras av den andra frågan skiljer sig från den första.
Enkla exempel:
- Användare A kör samma fråga två gånger.
- Däremellan kör Användare B en transaktion och förbinder sig.
- Icke-repeterbar läsning:A-raden som användare A har frågat har ett annat värde andra gången.
- Phantom read:Alla rader i frågan har samma värde före och efter, men olika rader väljs (eftersom B har tagit bort eller infogat några). Exempel:
select sum(x) from table;
kommer att returnera ett annat resultat även om ingen av de berörda raderna i sig har uppdaterats, om rader har lagts till eller tagits bort.
Vilken isoleringsnivå ska användas i exemplet ovan?
Vilken isoleringsnivå du behöver beror på din applikation. Det är en hög kostnad för en "bättre" isoleringsnivå (som minskad samtidighet).
I ditt exempel kommer du inte ha en fantomläsning, eftersom du bara väljer från en enda rad (identifierad med primärnyckel). Du kan ha icke-repeterbara läsningar, så om det är ett problem, kanske du vill ha en isoleringsnivå som förhindrar det. I Oracle kan transaktion A också utfärda en SELECT FOR UPDATE, sedan kan transaktion B inte ändra raden förrän A är klar.