Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Isolation | Acid
SQL-Optimierung und Abfragefunktionen

Isolation

Swipe um das Menü anzuzeigen

Im Kontext von Datenbanken bezeichnet Isolation die Fähigkeit eines Datenbanksystems, die Sichtbarkeit von Änderungen durch gleichzeitig ablaufende Transaktionen zu steuern. Sie stellt sicher, dass Transaktionen unabhängig voneinander ausgeführt werden, wodurch Störungen vermieden und die Datenintegrität gewahrt bleibt.

Es gibt 4 Isolationsstufen in SQL:

  • read uncommitted;
  • read committed;
  • repeatable read;
  • serializable.

Read uncommitted

Dies ist die niedrigste Isolationsstufe, bei der Transaktionen Änderungen sehen können, die von anderen Transaktionen vorgenommen wurden, selbst wenn diese noch nicht bestätigt wurden. Diese Stufe erlaubt Dirty Reads, das bedeutet, dass eine Transaktion Daten lesen kann, die von einer anderen Transaktion geändert, aber noch nicht bestätigt wurden.

Dirty Reads

Note
Mehr erfahren

Ein Dirty Read tritt auf, wenn eine Transaktion Daten liest, die von einer anderen Transaktion geändert, aber noch nicht bestätigt wurden.

Beispielsweise finden zwei Banktransaktionen gleichzeitig statt: Transaktion A prüft den Kontostand, während Transaktion B Geld auf das Konto einzahlt. Wenn Transaktion A den erhöhten Kontostand sieht, bevor Transaktion B abgeschlossen ist, handelt es sich um einen Dirty Read, da der neue Kontostand zurückgesetzt werden könnte, falls Transaktion B fehlschlägt.

dirty+read

Implementierung

Um die Isolationsstufe für die Transaktion festzulegen, kann folgender Befehl in der Abfrage verwendet werden:

-- Start transaction
BEGIN;
-- Set the isolation level for the transaction
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

/* Transaction query */
COMMIT;
  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;: Diese Anweisung ändert die Isolationsstufe für die aktuelle Transaktion auf "Read Uncommitted" und ermöglicht es der Transaktion, möglicherweise Daten zu lesen, die von anderen, noch nicht abgeschlossenen Transaktionen geändert wurden;

  • Dieser Befehl muss ausschließlich innerhalb des Transaktionsblocks verwendet werden! Andernfalls hat er keine Wirkung und es wird die Standard-Isolationsstufe verwendet.

Die aktuelle Isolationsstufe kann mit folgendem Befehl überprüft werden:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Die Isolationsstufe Read Committed stellt sicher, dass eine Transaktion nur Daten sieht, die von anderen Transaktionen bereits bestätigt wurden.
Das bedeutet, dass nicht bestätigte Änderungen anderer Transaktionen für Transaktionen mit Read Committed-Isolation nicht sichtbar sind.
Dadurch werden Dirty Reads verhindert, da eine Transaktion nur bestätigte Daten lesen kann. Allerdings gibt es bei dieser Transaktionsstufe Probleme mit nicht wiederholbaren Lesevorgängen.

Nicht wiederholbare Lesevorgänge

Note
Mehr erfahren

Ein nicht wiederholbarer Lesevorgang tritt auf, wenn eine Transaktion dieselbe Zeile innerhalb derselben Transaktion mehrfach liest, sich die gelesenen Daten jedoch zwischen den Lesevorgängen ändern, weil andere Transaktionen Änderungen vorgenommen haben. Diese Inkonsistenz kann zu unerwartetem Verhalten und fehlerhaften Ergebnissen führen.

Beispielsweise fragt eine Transaktion den Kontostand eines Kunden zweimal ab. Die erste Abfrage ergibt 1000 $, aber bevor die Transaktion abgeschlossen ist, zahlt eine andere Transaktion 500 $ auf das Konto ein. Bei der zweiten Abfrage werden 1500 $ angezeigt, was zu einem nicht wiederholbaren Lesevorgang führt, da innerhalb einer einzelnen Transaktion dieselben Daten unterschiedlich gelesen werden, weil eine andere Transaktion Änderungen vorgenommen hat.

Die Isolationsstufe "Read committed" erlaubt nicht wiederholbare Lesevorgänge, da sie den Lesevorgang für Werte sperrt, die sich in noch nicht abgeschlossenen Transaktionen befinden, aber den Schreibvorgang nicht sperrt.
Dadurch kann in die Zeile, die gerade von einer anderen Transaktion gelesen wird, neue Daten geschrieben werden.

Nicht wiederholbares Lesen

Verlorenes Update

Durch das Fehlen der Schreibsperre gibt es ein weiteres Problem mit dem Isolation Level Read Committed – verlorene Updates.

Note
Mehr erfahren

Ein verlorenes Update ist eine Situation im Datenbankmanagement, bei der eine Transaktion die von einer anderen Transaktion vorgenommenen Änderungen überschreibt, was zum Verlust von Daten führt. Dies tritt typischerweise auf, wenn mehrere Transaktionen versuchen, dieselben Daten gleichzeitig zu aktualisieren, und die Änderungen einer Transaktion von einer anderen überschrieben werden, bevor sie in der Datenbank gespeichert werden.

Verlorene Updates treten auf, wenn zwei parallele Transaktionen versuchen, dieselbe Zeile zu ändern. Dadurch überschreibt die später bestätigte Transaktion die von anderen Transaktionen bestätigten Werte.

Lost_update

Implementierung

Diese Isolationsstufe kann auch mit den folgenden Befehlen festgelegt werden:

-- Start transaction
BEGIN;
-- Set the isolation level for the session
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

/* Transaction query */
COMMIT;

Es ist wichtig zu beachten, dass Read Committed das Standard-Isolationslevel für die meisten Datenbankmanagementsysteme ist, weshalb wir es nicht explizit angeben müssen.

question mark

Wenn eine Transaktion Daten liest, die von einer anderen, noch nicht abgeschlossenen Transaktion geändert wurden, um welchen Lesetyp handelt es sich?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 6

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 1. Kapitel 6
some-alt