Web Development

Ein Lehrbuch für das Informatik oder Medien-Informatik Studium.

Transaktionen auf Ebene von SQL, hier am Beispiel von Postgres gezeigt.

ACID

Bei der Ausführung von Transaktionen muss das Transaktionssystem die ACID-Eigenschaften garantieren:

  • Atomarität (Atomicity)
  • Konsistenz (Consistency)
  • Isolation (Isolation)
  • Dauerhaftigkeit (Durability)

Atomarität bedeutet: Eine Transaktion wird entweder ganz oder gar nicht ausgeführt. Transaktionen sind also „unteilbar“. Wenn eine atomare Transaktion abgebrochen wird, ist das System unverändert.

Konsistenz bedeutet: Nach Ausführung der Transaktion muss der Datenbestand in einer konsistenten Form sein, wenn er es bereits zu Beginn der Transaktion war.

Isolation bedeutet: Bei gleichzeitiger Ausführung mehrerer Transaktionen dürfen sich diese nicht gegenseitig beeinflussen.

Dauerhaftigkeit bedeutete Die Auswirkungen einer Transaktion müssen im Datenbestand dauerhaft bestehen bleiben. Die Effekte von Transaktionen dürfen also nicht „mit der Zeit verblassen“ oder „aus Versehen verloren gehen“.

commit

Sql Code Beispiel für eine Transaktion in POSTGRES, die zwei Einfüge-Operationen zusammenfasst

BEGIN;
INSERT INTO staff (id, first, last) 
  VALUES (42, 'Alyssa', 'Hacker');
INSERT INTO salarychange (id, amount, changedate) 
  VALUES (42, 50000, NOW());
COMMIT;

rollback

Sql Code Beispiel für eine Transaktion in Postgres, die zurück-gerollt wird

BEGIN;
INSERT INTO staff (id, first, last) 
  VALUES (42, 'Alyssa', 'Hacker');
INSERT INTO salarychange (id, amount, changedate) 
  VALUES (42, 50000, NOW());
ROLLBACK;
-- nichts ist passiert!

Tipp: Nicht auf Input warten

Schlecht:

BEGIN;
-- warte auf input ... beliebig lagen
COMMIT;

Probleme ohne Transaktionen

Bei Datenbanken können durch mangelnde Transaktionsisolation die folgenden Anomalie auftreten:

  • Lost Updates: Zwei Transaktionen modifizieren parallel denselben Datensatz und nach Ablauf dieser beiden Transaktionen wird nur die Änderung von einer von ihnen übernommen.
  • Dirty Read: Daten einer noch nicht abgeschlossenen Transaktion werden von einer anderen Transaktion gelesen.
  • Non-Repeatable Read: Wiederholte Lesevorgänge liefern unterschiedliche Ergebnisse.
  • Phantom Read: Suchkriterien treffen während einer Transaktion auf unterschiedliche Datensätze zu, weil eine (während des Ablaufs dieser Transaktion laufende) andere Transaktion Datensätze hinzugefügt, entfernt oder verändert hat.

Weniger gute Transaktionen

Mit SET TRANSACTION ISOLATION LEVEL ... kann eine weniger gut Version von Transaktionen aktiviert werden. Die möglichen Werte sind (laut Postgres):

Read Committed Dieses Isolationslevel setzt für die gesamte Transaktion Schreibsperren auf Objekten, die verändert werden sollen, setzt Lesesperren aber nur kurzzeitig beim tatsächlichen Lesen der Daten ein. Daher können Non-Repeatable Read und Phantom Read auftreten, wenn während wiederholten Leseoperationen auf dieselben Daten, zwischen der ersten und der zweiten Leseoperation, eine Schreiboperation einer anderen Transaktion die Daten verändert und committed.

Repeatable Read Bei dieser Isolationsebene ist sichergestellt, dass wiederholte Leseoperationen mit den gleichen Parametern auch dieselben Ergebnisse haben. Sowohl bei Lese- als auch bei Schreiboperationen werden für die gesamte Dauer der Transaktion Sperren gesetzt. Dies führt dazu, dass bis auf Phantom Reads keine Anomalien auftreten können.

Serializable Die höchste Isolationsebene garantiert, dass die Wirkung parallel ablaufender Transaktionen exakt dieselbe ist wie sie die entsprechenden Transaktionen zeigen würden, liefen sie nacheinander in Folge ab

Vertiefende Informationen