Sperren (Locks) und Kompatibilitaetsmatrix
Transaktionen fordern zusaetzlich 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 koennen sich einen S-Lock teilen (S-S
vertraeglich). Sobald jemand ein X-Lock haelt, ist keine weitere Sperre moeglich. Der Scheduler im DBMS verwaltet die Lock Table.
Merksatz: S vertraegt S, alles Uebrige mit X ist tabu.
Zwei-Phasen-Sperrprotokoll (2PL)
Jede Transaktion durchlaeuft genau zwei Phasen: die Wachstumsphase, in der Sperren angefordert, aber keine freigegeben werden
duerfen, und die Schrumpfphase, in der Sperren freigegeben, aber keine neuen mehr angefordert werden duerfen. 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 unmoeglich, weil kein anderer Nutzer waehrend der Transaktion auf modifizierte Daten zugreifen kann.
Kaskadierendes Ruecksetzen ist ausgeschlossen. S2PL ist Standard in kommerziellen DBMS.
Merksatz: Strikt = Sperren erst am EOT loslassen.
Preclaiming (Konservatives 2PL)
Jede Transaktion muss ALLE benoetigten Sperren bereits am Transaktionsbeginn (BOT) anfordern. Erst wenn ALLE Sperren gewaehrt
wurden, darf die Transaktion starten. Da keine Transaktion inkrementell auf weitere Sperren wartet, kann kein Wartezyklus entstehen -
Deadlocks sind konstruktiv ausgeschlossen. Nachteil: reduzierte Nebenlaeufigkeit.
Merksatz: Alles vorab sperren oder gar nicht anfangen.
Deadlock und Erkennung
Beim reinen 2PL koennen zwei oder mehr Transaktionen zyklisch aufeinander warten. Beispiel: T1 haelt X(A) und wartet auf B,
T2 haelt S(B) und wartet auf A. Zur Erkennung wird ein Wartegraph gefuehrt (Kante T_i -> T_j wenn T_i auf eine Sperre wartet, die
T_j haelt). Ein Zyklus ist ein Deadlock. Aufloesung durch Rollback einer Transaktion.
Merksatz: Wartegraph mit Zyklus = Deadlock.
Verklemmungsvermeidung ueber Zeitstempel
Alternative zur Erkennung: Jede Transaktion bekommt einen eindeutigen Zeitstempel. Bei wound-wait bricht eine aeltere TA eine
juengere ab und laeuft selbst weiter (Junge warten auf Alte). Bei wait-die wartet eine aeltere TA auf die juengere, aber eine
juengere wird sofort abgebrochen. Damit sind Zyklen im Wartegraphen ausgeschlossen.
Merksatz: wound-wait - Alter schlaegt Junges; wait-die - Junges stirbt.
Konfliktserialisierbarkeit als Ziel
Ziel der gesamten sperrbasierten Synchronisation ist es, aus einer verzahnten parallelen Ausfuehrung eine Historie zu erzeugen,
die aequivalent zu einer seriellen ist. Konfliktoperationen (write-write, write-read, read-write) muessen 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.