almessadi.
Zur Übersicht

PostgreSQL-Isolationsstufen entscheiden, welche Nebenläufigkeitsfehler Sie tolerieren_

Transaktionen sind nicht automatisch sicher, nur weil sie `BEGIN` und `COMMIT` verwenden. Die Isolationsstufe bestimmt, welche Anomalien unter Last noch möglich sind.

Veröffentlicht30. August 2024
Lesezeit4 min read

Das Einwickeln von Code in eine Transaktion ist notwendig. Es ist jedoch nicht dasselbe wie die Gewährleistung von Nebenläufigkeitssicherheit.

Hier kommen die Isolationsstufen ins Spiel. Sie definieren, was eine Transaktion beobachten darf, während andere Transaktionen die gleichen Daten ändern.

Wenn Sie darüber nie nachdenken, liefern Sie schließlich ein System, das in lokalen Tests "korrekt" ist, aber subtil falsch unter konkurrierendem Verkehr.

Warum das Standardverhalten nicht immer ausreicht

PostgreSQL verwendet standardmäßig READ COMMITTED. Das ist für viele Arbeitslasten eine gute Voreinstellung, ermöglicht jedoch immer noch Muster, die überraschend sind, wenn Ihre Anwendungslogik von einer vollständig stabilen Sicht auf die Daten innerhalb einer Transaktion ausgeht.

Die richtige Frage lautet nicht:

"Haben wir eine Transaktion verwendet?"

Sondern:

"Welche Anomalien sind auf dieser Isolationsstufe für diese Geschäftsregel noch möglich?"

Ein praktisches Beispiel

Stellen Sie sich vor, zwei Anfragen versuchen, die letzte verfügbare Einheit Lagerbestand zu reservieren.

Wenn die Anwendung zuerst die Verfügbarkeit liest und dann entscheidet, ob sie später schreibt, hängt das Verhalten der Nebenläufigkeit stark davon ab, wie die Transaktion strukturiert ist und ob Sperren oder strengere Isolierung verwendet wird.

Ein vereinfachtes Muster sieht oft so aus:

BEGIN;

SELECT quantity
FROM inventory
WHERE sku = 'book-123';

UPDATE inventory
SET quantity = quantity - 1
WHERE sku = 'book-123';

COMMIT;

Ob das sicher ist, hängt von der umgebenden Logik, den Sperren, den Wiederholungen und der Isolationsstufe ab. Die Transaktionsgrenze allein beantwortet nicht die Frage.

Was erfahrene Ingenieure tatsächlich tun

Sie wählen aus:

  • einfacherer Standardisolierung mit sorgfältigen Sperren
  • Wiederholungslogik für Serialisierungsfehler
  • strengere Isolierung nur dort, wo die Geschäftsregel die Kosten rechtfertigt

Das ist eine viel gesündere Haltung als "immer serialisierbar verwenden" oder "das Standardverhalten ist wahrscheinlich in Ordnung."

Abwägungen

Strengere Isolierung kann die Richtigkeitsgarantien verbessern, führt jedoch auch zu:

  • erhöhter Wettbewerbsintensität
  • einer höheren Wahrscheinlichkeit für Transaktionswiederholungen
  • möglicherweise verringertem Durchsatz unter Last

Deshalb ist Isolierung ein technischer Kompromiss und keine moralische Wahl.

Weitere Lektüre