Isolationsgrade

Die Isolationsstufe einer Tabelle legt fest, inwieweit eine Transaktion von Änderungen durch gleichzeitige Transaktionen isoliert sein muss. Delta Lake in Azure Databricks unterstützt zwei Isolationsstufen: Serializable und WriteSerializable.

  • Serializable: die stärkste Isolationsstufe. Sie stellt sicher, dass alle Schreib- und Lesevorgänge serialisierbar sind. Vorgänge sind zulässig, solange es eine serielle Sequenz gibt, in der sie nacheinander ausgeführt werden und das gleiche Ergebnis wie in der Tabelle angegeben erzielt wird. Für die Schreibvorgänge ist die serielle Sequenz genau die gleiche wie im Verlauf der Tabelle.

  • WriteSerializable (Standard): eine schwächere Isolationsstufe als Serializable. Sie stellt lediglich sicher, dass die Schreibvorgänge (d. h. nicht die Lesevorgänge) serialisierbar sind. Sie ist jedoch immer noch stärker als die Momentaufnahmenisolation. WriteSerializable ist die Standardeinstellung für die Isolationsstufe, da sie für die meisten gängigen Vorgänge eine gute Balance zwischen Datenkonsistenz und Verfügbarkeit bietet.

    In diesem Modus kann sich der Inhalt der Delta-Tabelle von demjenigen unterscheiden, der aufgrund der Sequenz der Vorgänge im Tabellenverlauf erwartet wird. Das liegt daran, dass dieser Modus bestimmte Paare gleichzeitiger Schreibvorgänge (z. B. die Vorgänge X und Y) zulässt, sodass das Ergebnis so aussieht, als wäre Y vor X ausgeführt worden (was heißt, dass sie serialisierbar sind), obwohl der Verlauf zeigen würde, dass Y nach X ausgeführt wurde. Um diese Neuordnung zu verhindern, legen Sie die Isolationsstufe der Tabelle auf „Serializable“ fest, um diese Transaktionen fehlschlagen zu lassen.

Für Lesevorgänge gilt stets die Momentaufnahmenisolation. Die Isolationsstufe für Schreibvorgänge legt fest, ob es einem Leser möglich ist, eine Momentaufnahme einer Tabelle zu sehen, die laut Verlauf „nie vorhanden war“.

Auf der Stufe „Serializable“ sieht ein Leser stets nur Tabellen, die dem Verlauf entsprechen. Auf der Stufe WriteSerializable könnte ein Leser eine Tabelle sehen, die im Delta-Protokoll nicht vorhanden ist.

Angenommen, txn1 ist ein zeitintensiver Löschvorgang, und txn2 fügt Daten ein, die von txn1 gelöscht wurden. txn2 und txn1 werden abgeschlossen und in dieser Reihenfolge im Verlauf aufgezeichnet. Dem Verlauf nach sollten die in txn2 eingefügten Daten nicht in der Tabelle vorhanden sein. Auf der Stufe „Serializable“ sähe ein Leser niemals die von txn2 eingefügten Daten. Auf der Stufe WriteSerializable könnte ein Leser jedoch zu einem bestimmten Zeitpunkt die von txn2 eingefügten Daten sehen.

Weitere Informationen dazu, welche Arten von Vorgängen auf den einzelnen Isolationsstufen miteinander in Konflikt geraten können und welche Fehler möglich sind, finden Sie unter Parallelitätssteuerung.

Festlegen der Isolationsstufe

Sie legen die Isolationsstufe mithilfe des Befehls ALTER TABLE fest.

ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.isolationLevel' = <level-name>)

Dabei ist <level-name> entweder Serializable oder WriteSerializable.

Um beispielsweise die Isolationsstufe von der Standardeinstellung WriteSerializable in Serializable zu ändern, führen Sie Folgendes aus:

ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.isolationLevel' = 'Serializable')