Deadlock (Verklemmung)
Ein Deadlock liegt vor, wenn zwei oder mehr Transaktionen zyklisch aufeinander warten. T1 haelt eine Sperre auf A und benoetigt B, waehrend T2 B haelt und A benoetigt. Ohne Eingriff wartet beides ewig. Voraussetzung ist typischerweise das strenge 2PL-Protokoll, das Sperren bis EOT haelt. Deadlocks sind ein Konsistenzsicherungs-Problem und muessen vom DBMS entdeckt und aufgeloest werden.
Zwei Transaktionen, zwei Sperren, kreuzweise gefordert = Deadlock.
Wait-for-Graph (Wartegraph)
Der Wartegraph ist ein gerichteter Graph mit Knoten fuer Transaktionen und Kanten Ti -> Tj, wenn Ti auf eine Sperre wartet, die Tj haelt. Er wird aus der Lock-Tabelle des DBMS gebildet. Enthaelt der Graph einen Zyklus, liegt ein Deadlock vor. Zyklenerkennung erfolgt per Tiefensuche. Zur Aufloesung wird eine Transaktion aus dem Zyklus ausgewaehlt, zurueckgesetzt (abort + R1-Recovery) und dadurch koennen beide Zyklen mit einem einzigen Opfer aufgebrochen werden, wenn dieses gemeinsame Knoten liegt.
Zyklus im Wartegraph = Deadlock, Opfer bricht den Kreis.
Preclaiming
Beim Preclaiming muss jede Transaktion vor Ausfuehrung ihrer Operationen ALLE benoetigten Sperren auf einmal erwerben. Erst wenn alle Sperren vorhanden sind, startet die eigentliche Arbeit. In Verbindung mit strengem 2PL bedeutet dies, dass die Sperrmenge sofort auf Maximum steht und bis EOT gehalten wird. Dadurch koennen niemals zwei Transaktionen wechselseitig auf Sperren warten. Nachteil: geringere Parallelitaet und man muss im Voraus wissen, welche Objekte gebraucht werden.
Alles vorab sperren, dann arbeiten - keine Kreise moeglich.
Wound-Wait (Junge warten auf Alte)
Zeitstempel-basierte Vermeidung. Jede Transaktion bekommt beim Start einen eindeutigen Zeitstempel. Aeltere TAs haben kleinere Stempel. Fordert T1 eine Sperre an, die T2 haelt: Ist T1 aelter als T2, wird T2 abgebrochen (wound) und zurueckgesetzt, T1 laeuft weiter. Ist T1 juenger, wartet T1 regulaer. Wound-Wait bevorzugt aeltere Transaktionen, indem sie juengere verdraengen.
Alte darf junge verletzen - junge warten geduldig.
Wait-Die (Alte warten auf Junge)
Zweite Zeitstempel-Strategie. Fordert T1 eine Sperre, die T2 haelt: Ist T1 aelter als T2, wartet T1 auf die Freigabe. Ist T1 juenger, wird T1 abgebrochen (die) und mit gleichem Zeitstempel neu gestartet. Bei Wait-Die duerfen nur aeltere Transaktionen warten, juengere sterben und werden neu gestartet. Beide Strategien vermeiden Zyklen, weil die Warterichtung immer nur in eine Zeitstempel-Richtung geht.
Alte warten geduldig, junge sterben und starten neu.
Erkennung vs. Vermeidung
Zwei Grundansaetze: Deadlock-Erkennung (detection) laesst Deadlocks entstehen und loest sie ueber den Wartegraph auf. Deadlock-Vermeidung (avoidance/prevention) verhindert Deadlocks strukturell, z.B. durch Preclaiming oder Zeitstempel. Erkennung erlaubt hoehere Parallelitaet, kostet aber Zyklensuche. Vermeidung ist proaktiv, reduziert aber Nebenlaeufigkeit oder erzeugt unnoetige Rollbacks.
Erkennen und aufloesen oder vermeiden bevor es passiert.
Strenges 2PL als Voraussetzung
Deadlocks sind ein typisches Problem des strengen Zwei-Phasen-Sperrprotokolls (S2PL). Dort werden alle Sperren bis zum EOT gehalten, damit kaskadierendes Ruecksetzen ausgeschlossen ist. Genau dieses lange Halten der Sperren macht aber Zyklen im Wartegraph moeglich. Ohne 2PL waeren Deadlocks im klassischen Sinn nicht das Hauptproblem, dafuer aber Inkonsistenzen wie Dirty Read und Lost Update.
S2PL sichert Konsistenz, oeffnet aber Tuer fuer Deadlocks.
Aufloesung durch Rollback (Opferwahl)
Wird ein Zyklus erkannt, waehlt das DBMS ein Opfer im Zyklus aus (haeufig die juengste, die mit wenigsten Sperren oder die mit geringsten Kosten). Das Opfer erhaelt abort und wird per R1-Recovery zurueckgesetzt. Die freigewordenen Sperren erlauben den anderen TAs, weiterzulaufen. Liegt ein Knoten in mehreren Zyklen, kann sein Rollback mehrere Verklemmungen gleichzeitig loesen.
Ein Opfer, ein Rollback - der Zyklus zerfaellt.