Van Wikipedia (die hier geweldige en gedetailleerde voorbeelden voor heeft):
Een niet-herhaalbare lezing vindt plaats wanneer tijdens een transactie een rij twee keer wordt opgehaald en de waarden binnen de rij verschillen tussen lezingen.
en
Een phantom read vindt plaats wanneer tijdens een transactie twee identieke query's worden uitgevoerd en de verzameling rijen die door de tweede query wordt geretourneerd, verschilt van de eerste.
Eenvoudige voorbeelden:
- Gebruiker A voert dezelfde query twee keer uit.
- Tussendoor voert gebruiker B een transactie uit en verbindt zich.
- Niet-herhaalbare lezing:de A-rij die gebruiker A heeft opgevraagd, heeft de tweede keer een andere waarde.
- Spooklezen:alle rijen in de zoekopdracht hebben dezelfde waarde ervoor en erna, maar er worden verschillende rijen geselecteerd (omdat B enkele heeft verwijderd of ingevoegd). Voorbeeld:
select sum(x) from table;
zal een ander resultaat retourneren, zelfs als geen van de betrokken rijen zelf is bijgewerkt, als rijen zijn toegevoegd of verwijderd.
Welk isolatieniveau moet in het bovenstaande voorbeeld worden gebruikt?
Welk isolatieniveau u nodig heeft, hangt af van uw toepassing. Er zijn hoge kosten verbonden aan een "beter" isolatieniveau (zoals verminderde gelijktijdigheid).
In uw voorbeeld heeft u geen phantom read, omdat u slechts uit een enkele rij selecteert (geïdentificeerd door primaire sleutel). U kunt niet-herhaalbare uitlezingen hebben, dus als dat een probleem is, wilt u misschien een isolatieniveau hebben dat dat voorkomt. In Oracle kan transactie A ook een SELECT FOR UPDATE afgeven, waarna transactie B de rij niet kan veranderen totdat A klaar is.