Sperren (Locks) und Kompatibilitätsmatrix
Transaktionen fordern zusätzlich zu read/write auch Sperren an und geben sie wieder frei. Es gibt zwei Sperrmodi: S (shared,
Lesesperre) und X (exclusive, Schreibsperre); NL bedeutet keine Sperre. Mehrere Leser können sich einen S-Lock teilen (S-S
verträglich). Sobald jemand ein X-Lock hält, ist keine weitere Sperre möglich. Der Scheduler im DBMS verwaltet die Lock Table.
Merksatz: S verträgt S, alles Übrige mit X ist tabu.
Zwei-Phasen-Sperrprotokoll (2PL)
Jede Transaktion durchläuft genau zwei Phasen: die Wachstumsphase, in der Sperren angefordert, aber keine freigegeben werden
dürfen, und die Schrumpfphase, in der Sperren freigegeben, aber keine neuen mehr angefordert werden dürfen. Sobald die erste
Sperre freigegeben wird, ist die Wachstumsphase beendet. 2PL garantiert konfliktserialisierbare Historien.
Merksatz: Erst alle Sperren sammeln, dann nur noch abbauen.
Striktes 2PL (S2PL)
Erweiterung von 2PL: ALLE Sperren werden bis zum Transaktionsende (EOT, also commit oder abort) gehalten und erst dann freigegeben.
Damit sind Dirty Reads unmöglich, weil kein anderer Nutzer während der Transaktion auf modifizierte Daten zugreifen kann.
Kaskadierendes Rücksetzen ist ausgeschlossen. S2PL ist Standard in kommerziellen DBMS.
Merksatz: Strikt = Sperren erst am EOT loslassen.
Preclaiming (Konservatives 2PL)
Jede Transaktion muss ALLE benötigten Sperren bereits am Transaktionsbeginn (BOT) anfordern. Erst wenn ALLE Sperren gewährt
wurden, darf die Transaktion starten. Da keine Transaktion inkrementell auf weitere Sperren wartet, kann kein Wartezyklus entstehen -
Deadlocks sind konstruktiv ausgeschlossen. Nachteil: reduzierte Nebenläufigkeit.
Merksatz: Alles vorab sperren oder gar nicht anfangen.
Deadlock und Erkennung
Beim reinen 2PL können zwei oder mehr Transaktionen zyklisch aufeinander warten. Beispiel: T1 hält X(A) und wartet auf B,
T2 hält S(B) und wartet auf A. Zur Erkennung wird ein Wartegraph geführt (Kante T_i -> T_j wenn T_i auf eine Sperre wartet, die
T_j hält). Ein Zyklus ist ein Deadlock. Auflösung durch Rollback einer Transaktion.
Merksatz: Wartegraph mit Zyklus = Deadlock.
Verklemmungsvermeidung über Zeitstempel
Alternative zur Erkennung: Jede Transaktion bekommt einen eindeutigen Zeitstempel. Bei wound-wait bricht eine ältere TA eine
jüngere ab und läuft selbst weiter (Junge warten auf Alte). Bei wait-die wartet eine ältere TA auf die jüngere, aber eine
jüngere wird sofort abgebrochen. Damit sind Zyklen im Wartegraphen ausgeschlossen.
Merksatz: wound-wait - Alter schlägt Junges; wait-die - Junges stirbt.
Konfliktserialisierbarkeit als Ziel
Ziel der gesamten sperrbasierten Synchronisation ist es, aus einer verzahnten parallelen Ausführung eine Historie zu erzeugen,
die äquivalent zu einer seriellen ist. Konfliktoperationen (write-write, write-read, read-write) müssen in einer eindeutigen
Reihenfolge stehen. 2PL sichert dies, weil eine TA erst dann ihre erste Sperre freigibt, wenn alle Konflikte abgeschlossen sind.
Merksatz: Korrekt = konfliktserialisierbar; 2PL erzwingt das.