Transaktion und ACID-Prinzip
Eine Transaktion ist eine Folge von Operationen, die die Datenbank von einem konsistenten in einen konsistenten Zustand überführt. Sie muss das ACID-Prinzip einhalten: Atomicity (Alles-oder-Nichts), Consistency (Konsistenzerhaltung), Isolation (jede Transaktion arbeitet scheinbar allein) und Durability (dauerhafte Speicherung nach Commit). Transaktionen kapseln Nutzer im Mehrbenutzerbetrieb voneinander ab. Ohne Transaktionen könnten parallele Operationen sich gegenseitig stören.
A-C-I-D: Alles oder nichts, Konsistent, Isoliert, Dauerhaft.
BEGIN / START TRANSACTION (BOT)
Der Befehl BEGIN TRANSACTION oder START TRANSACTION kennzeichnet den Beginn einer Transaktion (Begin Of Transaction, BOT). Ab diesem Punkt werden alle nachfolgenden SQL-Befehle als atomare Gesamtheit behandelt. In vielen DBMS startet auch implizit eine neue Transaktion nach jedem COMMIT oder ROLLBACK. Die konkrete Syntax hängt vom DBMS ab, das Schlüsselwort TRANSACTION ist teilweise optional.
BOT öffnet die Klammer, COMMIT oder ROLLBACK schließt sie.
COMMIT (WORK)
COMMIT signalisiert den erfolgreichen Abschluss einer Transaktion. Alle Änderungen der Transaktion werden festgeschrieben (persistent gemacht) und sind für andere Transaktionen sichtbar. Das Schlüsselwort WORK ist meist optional. Nach einem COMMIT ist der Zustand dauerhaft (Durability). Das DBMS prüft dabei Konsistenzbedingungen.
COMMIT = festgeschrieben und dauerhaft.
ROLLBACK / ABORT (WORK)
ROLLBACK oder ABORT bricht die Transaktion ab und setzt die Datenbasis auf den Zustand vor Beginn der Transaktion zurück. Anders als COMMIT muss das DBMS die erfolgreiche Ausführung eines ROLLBACK immer garantieren können. Es realisiert damit die Atomicity-Eigenschaft. Ein ROLLBACK kann durch den Nutzer, das DBMS (z.B. bei Deadlock) oder einen Systemfehler ausgelöst werden.
ROLLBACK = Zeitreise zurück zum Startpunkt der Transaktion.
SAVEPOINT
SAVEPOINT definiert innerhalb einer aktiven Transaktion einen Sicherungspunkt, auf den man teilweise zurücksetzen kann, ohne die gesamte Transaktion abzubrechen. Alle Änderungen bis zum Savepoint müssen vom DBMS gemerkt werden, sind aber noch nicht endgültig festgeschrieben. Ein ROLLBACK TO SAVEPOINT verwirft nur Änderungen seit dem Savepoint. Ein finales COMMIT oder ROLLBACK schließt die Transaktion trotzdem ab.
SAVEPOINT = Zwischenstand speichern, Teil-Rollback möglich.
SET TRANSACTION und Isolationslevel
Mit SET TRANSACTION lassen sich Zugriffsmodus (READ ONLY / READ WRITE) und Isolationslevel setzen. Es gibt vier Level: READ UNCOMMITTED (schwächste Stufe, Dirty Reads erlaubt), READ COMMITTED (nur committete Werte lesbar), REPEATABLE READ (kein nonrepeatable read, aber Phantoms möglich) und SERIALIZABLE (volle Serialisierbarkeit). Ein niedrigeres Level erhöht Durchsatz auf Kosten der Konsistenz. Der Isolationslevel kann pro Transaktion angegeben werden.
SET TRANSACTION = Isolation stufenweise aufweichen für mehr Parallelität.
Mehrbenutzer-Anomalien
Ohne ausreichende Isolation treten vier klassische Probleme auf: Dirty Read (Lesen nicht-committeter Daten), Nonrepeatable Read (gleiches SELECT liefert unterschiedliche Ergebnisse), Phantom Read (neue Tupel erscheinen bei erneuter Anfrage) und Lost Update (Überschreiben paralleler Änderungen). Diese Anomalien führen zu inkonsistenten Ergebnissen. Der gewählte Isolationslevel bestimmt, welche Anomalien noch auftreten können.
Vier Anomalien: Dirty, Nonrepeatable, Phantom, Lost Update.
Serialisierbarkeit und Historie
Eine Historie (Transaction Schedule) ist die sequenzielle Anordnung aller Aktionen paralleler Transaktionen. Eine serielle Historie führt Transaktionen hintereinander aus. Eine serialisierbare Historie ist zwar verzahnt, hat aber ein Ergebnis, das identisch zu irgendeiner seriellen Historie wäre. Ziel des DBMS ist es, korrekte (serialisierbare) parallele Pläne zu finden, um Effizienz und Konsistenz zu vereinen.
Korrekt = Serialisierbar: verzahnt, aber ergebnisgleich zu einer seriellen Ausführung.