Transaktionsisolierung beeinflusst, wie gleichzeitige Transaktionen die Änderungen anderer Transaktionen sehen. Dies ist ein wichtiger Teil der ACID-Eigenschaften. Es gibt vier grundlegende Isolationsstufen in ANSI SQL:
Die Wahl des Niveaus hängt von den Anforderungen der Anwendung ab:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; -- Weitere SELECT-Anweisungen sehen "eingefrorene" Werte
"Gewährleistet das Niveau REPEATABLE READ den Schutz vor phantomen Lesevorgängen in jeder Datenbank?"
Nein. In PostgreSQL und einigen anderen DBMS verhindert das Niveau REPEATABLE READ nur schmutzige und nicht-wiederholbare Lesevorgänge, bietet jedoch nicht unbedingt Schutz vor phantomen Lesevorgängen. In MySQL/InnoDB ist REPEATABLE READ im Wesentlichen SERIALIZABLE, aber in anderen DBMS nicht.
-- In einer Transaktion lesen wir SELECT * FROM orders WHERE amount > 100; -- In einer anderen Transaktion wird ein neuer Wert mit amount > 100 eingefügt und committet. -- Die erste Transaktion wird bei einer wiederholten SELECT-Anweisung eine "phantomartige" Zeile sehen, wenn die Isolierung unter SERIALIZABLE liegt.
Geschichte
Ein Finanzdienst hat nur READ COMMITTED wegen der Leistung blockiert — der Benutzer sah einen Betrag, den ein anderer Prozess bereits geändert hatte, es gab Unterschiede im Saldo.
Geschichte
Im Hotelbuchungssystem gab es doppelte Buchungen desselben Zimmers — die Transaktionen isolierten nicht die Abfragen aktueller Buchungen, das Niveau war READ COMMITTED.
Geschichte
Übergang von MySQL zu PostgreSQL: Der Entwickler war es gewohnt, dass REPEATABLE READ vor Phantomen schützt, aber nach der Migration traten "hängende" Aufträge auf, die man bei wiederholten Anfragen innerhalb derselben Transaktion nicht erwartet hatte.