Direkt zum Hauptinhalt springen
eLearner.app
Modul 11 · Lektion 4 von 444/57 im Kurs~12 min
Lektionen des Moduls (4/4)

Isolationsstufen

Über das explizite FOR UPDATE hinaus verfügen Transaktionen auch über angeborene mathematische Regeln, die tief in die Engine integriert sind und bestimmen, wie viel Energie standardmäßig für die Isolierung jeder einzelnen Interaktion aufgewendet werden muss. Dies wird als Isolationsstufe bezeichnet. In der SQL-Welt kennen wir vier Standardmodelle, in der Reihenfolge ihrer Leistung und Sicherheit, aber offensichtlich umgekehrt in Bezug auf die Leistung.

  • READ UNCOMMITTED: Anarchischer Wahnsinn, Ihre Transaktion wird jede von anderen vorgenommene Änderung sehen, einschließlich temporärer Daten von Leuten, die gerade ihre eigenen Skripte durchgearbeitet haben. Aufgrund der ständigen Dirty-Read-Fehler verwendet es niemand für große Datenbanken.
  • READ COMMITTED: (Standard für Postgres). Sie sehen sofort neue Daten, sobald ein Dritter ein COMMIT ausgibt, Sie können jedoch Opfer von Phantom-Lesevorgängen (das Sehen neuer Datensätze mitten in Ihren langen Arbeitsabläufen) oder einer nichtlinearen konsistenten Ansicht werden.
  • REPEATABLE READ: Schwerer. Für die Dauer Ihrer großen Zeitfenstersitzung „sehe“ ich, dass die Datenbank in dem Moment eingefroren ist, in dem meine Abfrage gestartet wurde, und sogar die offiziellen Commits, die von anderen Leuten durchgeführt wurden, völlig ignoriert und außer Acht gelassen habe! Es schützt vor dem magischen Auftauchen von Schallplatten und garantiert Stabilität.
  • SERIALIZABLE:-Gottstufe (Superlangsam). Behandelt jede überlappende Transaktion, indem es sie blockiert und seriell in einer einzigen Spur ausführt, kollidierende Transaktionen rücksichtslos abbricht und sogar die wissenschaftliche Möglichkeit der geringsten Kollision an der Wurzel eliminiert, wodurch satte 90 % des hohen Durchsatzes geopfert werden.

Wie stellt man es ein?

Anstelle des normalen BEGIN; geben Sie Folgendes ein:

SQL
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;

Oder bei einigen Varianten und älteren Engines weisen Sie es nach dem Start zu:

SQL
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Probieren Sie es selbst aus

Übung#sql.m11.l4.e1
Versuche: 0Wird geladen…

Starten Sie eine Transaktion, indem Sie die globale Ebene für die Lebensdauer der Abfrage formell auf WIEDERHOLBARES LESEN setzen, um einen eingefrorenen, geschützten Austausch zu erstellen. Bedenken Sie, dass sie auf der Abfrageebene keinen Zweck erfüllt, es sei denn, es folgt etwas anderes. Schließen Sie sie daher mit „COMMIT“ leer.

Editor wird geladen…
Hinweis anzeigen

Öffnen Sie mit BEGIN ISOLATION LEVEL REPEATABLE READ; und schließen Sie mit COMMIT;

Lösung nach 3 Versuchen verfügbar

Übung#sql.m11.l4.e2
Versuche: 0Wird geladen…

Probieren wir die verrückte serialisierbare Ebene aus und fügen einige fiktive Daten ein. Öffnen Sie einen „SERIALIZABLE“-Block. Aktualisieren Sie den Namen der Kategorie Id=2 in „Nuovo Nome Segreto“. Führen Sie den letzten atomaren, abschließenden Commit aus.

Editor wird geladen…
Hinweis anzeigen

BEGIN ISOLATION LEVEL SERIALIZABLE; Kategorien aktualisieren SET name = 'Nuovo Nome Segreto' WHERE id = 2; COMMIT;

Lösung nach 3 Versuchen verfügbar