Transaktion und ACID-Prinzip
Eine Transaktion ist eine Folge von Operationen, die die Datenbank von einem konsistenten in einen konsistenten Zustand ueberfuehrt. 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 koennten parallele Operationen sich gegenseitig stoeren.
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 haengt vom DBMS ab, das Schluesselwort TRANSACTION ist teilweise optional.
BOT oeffnet die Klammer, COMMIT oder ROLLBACK schliesst sie.
COMMIT (WORK)
COMMIT signalisiert den erfolgreichen Abschluss einer Transaktion. Alle Aenderungen der Transaktion werden festgeschrieben (persistent gemacht) und sind fuer andere Transaktionen sichtbar. Das Schluesselwort WORK ist meist optional. Nach einem COMMIT ist der Zustand dauerhaft (Durability). Das DBMS prueft 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 zurueck. Anders als COMMIT muss das DBMS die erfolgreiche Ausfuehrung eines ROLLBACK immer garantieren koennen. Es realisiert damit die Atomicity-Eigenschaft. Ein ROLLBACK kann durch den Nutzer, das DBMS (z.B. bei Deadlock) oder einen Systemfehler ausgeloest werden.
ROLLBACK = Zeitreise zurueck zum Startpunkt der Transaktion.
SAVEPOINT
SAVEPOINT definiert innerhalb einer aktiven Transaktion einen Sicherungspunkt, auf den man teilweise zuruecksetzen kann, ohne die gesamte Transaktion abzubrechen. Alle Aenderungen bis zum Savepoint muessen vom DBMS gemerkt werden, sind aber noch nicht endgueltig festgeschrieben. Ein ROLLBACK TO SAVEPOINT verwirft nur Aenderungen seit dem Savepoint. Ein finales COMMIT oder ROLLBACK schliesst die Transaktion trotzdem ab.
SAVEPOINT = Zwischenstand speichern, Teil-Rollback moeglich.
SET TRANSACTION und Isolationslevel
Mit SET TRANSACTION lassen sich Zugriffsmodus (READ ONLY / READ WRITE) und Isolationslevel setzen. Es gibt vier Level: READ UNCOMMITTED (schwaechste Stufe, Dirty Reads erlaubt), READ COMMITTED (nur committete Werte lesbar), REPEATABLE READ (kein nonrepeatable read, aber Phantoms moeglich) und SERIALIZABLE (voelle Serialisierbarkeit). Ein niedrigeres Level erhoeht Durchsatz auf Kosten der Konsistenz. Der Isolationslevel kann pro Transaktion angegeben werden.
SET TRANSACTION = Isolation stufenweise aufweichen fuer mehr Parallelitaet.
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 (Ueberschreiben paralleler Aenderungen). Diese Anomalien fuehren zu inkonsistenten Ergebnissen. Der gewaehlte Isolationslevel bestimmt, welche Anomalien noch auftreten koennen.
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 fuehrt Transaktionen hintereinander aus. Eine serialisierbare Historie ist zwar verzahnt, hat aber ein Ergebnis, das identisch zu irgendeiner seriellen Historie waere. Ziel des DBMS ist es, korrekte (serialisierbare) parallele Plaene zu finden, um Effizienz und Konsistenz zu vereinen.
Korrekt = Serialisierbar: verzahnt, aber ergebnisgleich zu einer seriellen Ausfuehrung.