Basis van databases
Transactie T1 voerde SELECT COUNT(*) FROM Bestelling WHERE Bedrag >= 1000 uit en kreeg 8. Direct daarna voegde T2 met INSERT een rij toe voor een bestelling met een bedrag van 2000 en voerde een commit uit. Toen T1 hetzelfde SELECT-statement opnieuw uitvoerde, kreeg het 9. Welk verschijnsel is dit?
- ANon-repeatable read
- BDirty read
- CPhantom read
Antwoord en toelichting tonen
Antwoord: C. Phantom read
Wanneer binnen één transactie een zoekopdracht met dezelfde voorwaarde wordt herhaald en de verzameling resultaatrijen verandert omdat een andere transactie tussendoor passende rijen heeft toegevoegd (of verwijderd) en gecommit, heet dat verschijnsel een phantom read (of phantom). De naam komt doordat de nieuw verschenen rijen als spoken (phantoms) opduiken. Een non-repeatable read is wanneer een al gelezen rij bij opnieuw lezen een andere waarde heeft (of verdwenen is), omdat een andere transactie haar heeft gewijzigd of verwijderd en gecommit. Locks op bestaande rijen kunnen niet voorkomen dat rijen die nog niet bestaan worden toegevoegd, dus om phantoms te voorkomen zijn mechanismen nodig zoals het locken van het bereik dat de zoekvoorwaarde omvat. Volgens de SQL-standaard treden bij het isolatieniveau SERIALIZABLE geen phantoms op. T2 heeft gecommit, dus het is geen dirty read.