8. Synchronisations-Verfahren Die verschiedenen Synchronisationsverfahren unterscheiden sich i.w. dadurch, wie sie die Einhaltung des Serialisierbarkeitsprinzips gewährleisten wann die Prüfung auf Serialisierbarkeit vorgenommen wird was die äquivalente serielle Ausführungsreihenfolge bestimmt. 8.1 Sperrverfahren Prinzip: Jedes Datenobjekt wird vor dem Zugriff mit einer geeigneten Sperre belegt Definition 8-1: Zwei-Phasen-Sperrprotokoll (PL-Protokoll) Eine Transaktion beachtet das PL-Protokoll genau dann, wenn sie 1. jedes Datenbankobjekt, das sie zur Ausführung benötigt, vor dem Zugriff mit einer (geeigneten) Sperre belegt. keine Sperren mehr anfordert, sobald sie einmal eine Sperre freigegeben hat. 8. Synchronisationsverfahren 8-1
Eine nicht-serialisierbare Ausführungsreihenfolge wird dadurch erkannt bzw. verhindert, daß ggf. mehrere Transaktionen zyklisch auf die Freigabe einer Sperre warten, die von einer anderern Transaktion gehalten wird. Die äquivalente serielle Ausführungsreihenfolge wird beim PL durch den jeweiligen "Lock-all -Point" der Transaktionen definiert. Die Implementierung der Sperren erfolgt mittels einer Sperrtabelle. Im Prinzip zwei Vorgehensweisen möglich: zentrales Sperren mittels zentraler Sperrtabelle verteiltes Sperren mittels dezentraler Sperrtabellen starte T T" Sub-Transaktion Knoten A starte Sub-Transaktion sperre Objekt a für T Knoten C sperre Objekt c für T" T' sperre Objekt b für T' Lock Manager Knoten B Knoten D Abb. 8-1: Sperren mittels zentraler Sperrtabelle 8. Synchronisationsverfahren 8-
Lock Manager sperre a T starte Sub-Transaktion Knoten A starte Sub-Transaktion T" sperre c T' Lock Manager sperre b Lock Manager Knoten C Knoten B Abb. 8-: Sperren mit dezentralen Sperrtabellen 8. Synchronisationsverfahren 8-3
8. Optimistische Synchronisationsverfahren Drei Phasen: Lesephase: ungeschütztes Lesen Vorbereitung von Änderungen auf lokalen Kopien Validationsphase: kritischer Abschnitt Prüfung, ob "dirty reads" bzw. "veraltetes Lesen" vorgekommen ist Austritt 1 auf Validationsphase definiert die äquivalente serielle Ausführungsreihenfolge. Schreibphase: Einbringung der Änderungen in die Datenbank. Lesephase Validationsphase Schreibphase Die Schreibphase muß im verteilten Fall mittels Zwei-Phasen- Commit koordiniert werden, sonst Gefahr nicht-serialisierbarer globaler Schedules. Deshalb: Eintritt in die Validationsphase muß zwischen den beteiligten Teiltransaktionen koordiniert werden Teiltransaktionen müssen lokal in derselben Reihenfolge in Bezug auf andere Transaktionen validieren. 1 Da die Validationsphase jeweils exklusiv durchlaufen wird, kann man genausogut den Eintrittszeitpunkt oder einen beliebigen Zeitpunkt zwischen Eintritt und Austritt wählen. 8. Synchronisationsverfahren 8-4
8.3 Andere Synchronisations-Verfahren Ansatzpunkt (i.d.r.): Verringerung bzw. Vermeidung des Aufwandes für die Synchronisation bzw. die Deadlock-Suche Geringerer Aufwand wird in der Regel erreicht durch Inkaufnahme an sich unnötiger Transaktions-Abbrüche Verschiedene Ansätze: Verklemmungs-vermeidende Sperr-Verfahren Zeitstempelbasierte Verfahren 8.3.1 Verklemmungsvermeidende Sperrverfahren Definition von Regeln, wann eine Transaktion bei Sperr- Konflikten auf eine andere Transaktion wartet 3 Fordere T i eine Sperre für ein Objekt an, das T j bereits gesperrt hat siehe z.b. Özsu/Valduriez, S. 6 ff. 3 Vgl. D. J. Rosenkrantz, R. E. Stearns, Ph. M. Lewis II: System Level Concurrency Control for Distributed Database Systems, ACM Transactions on Database Systems, Vol. 3, No., June 198, pp. 18-198 8. Synchronisationsverfahren 8-5
WAIT-DIE-Regel: if TS(T i ) < TS(T j ) then T i waits else T i dies D.h. Transaktion T i darf auf die Freigabe der Sperre nur dann warten, wenn sie "älter" als T j ist. Bei Abbruch (dann ist sie die "jüngere" Transaktion) wird T i mit der alten Zeitmarke erneut gestartet. Fall 1: T Fall : T 1 T 1 möchte sperren wait x hat gesperrt T möchte sperren die x hat gesperrt WOUND-WAIT-Regel: if TS(T i ) < TS(T j ) then T j is wounded else T i waits Wenn T j "verwundet" wird, wird T j abgebrochen und neu gestartet. Fall 1: T Fall : T 1 wound ( kill ) hat gesperrt hat gesperrt T 1 möchte sperren x T möchte sperren wait x 8. Synchronisationsverfahren 8-6
8.3. Zeitstempelbasierte Verfahren Synchronisations-Hilfsmittel: "Globale Uhr" Serialisierbarkeit der globalen Transaktionen in Zeitstempel (TS 4 )-Reihenfolge (BOT-TS-Reihenfolge) Echte globale Uhr i.a. nicht verfügbar Simulation einer globalen Uhr mittels lokaler Uhren Alternativen: Annahme, daß lokale Uhr - bis auf kleines - synchron laufen Laufender Abgleich und ggf. Aktualisierung der lokalen Uhren beim Empfang von Nachrichten "Eindeutigmachung" der "globalen Zeit" (falls erforderlich) durch Anhängen der KnotenID Ziel: Reine lokale Entscheidung, ob Lesen bzw. Ändern eines Objektes möglich ( Serialisierbarkeit) Basis: Transaktions- + objektbezogen Zeitstempel 4 TS = Timestamp 8. Synchronisationsverfahren 8-
Einfaches Zeitstempelverfahren: 5 Zwei Zeitstempel je Objekt x: Lese-Zeitstempel: TSR(x) := max { TS(t) Transaktion t hat lesend auf x zugegriffen } Schreib-Zeitstempel: TSW(x) := max { TS(t) Transaktion t hat schreibend auf x zugegriffen } Algorithmus 8-1: Einfaches Zeitstempelverfahren Transaktion T will auf Objekt x zugreifen: CASE action OF read: IF TS(T) < TSW(x) THEN reject read ELSE BEGIN führe read aus; TSR(x) := max { TSR(x), TS(T) } END; write: IF TS(T) < max { TSR(x), TSW(x) } THEN reject write ELSE BEGIN führe write aus; TSW(x) := TS(T) END; END CASE; 5 Verschiedene Varianten möglich, vgl. hierzu Ph. A. Bernstein, N. Goodman: Concurrency Control in Distributed Database Systems, ACM Computing Surveys, Vol. 13, No., June 1981, pp. 184-1 8. Synchronisationsverfahren 8-8
Anmerkungen: Gültiges Lesen (nicht "zu neu") eines Objektes wird dadurch gewährleistet, daß die BOT-TS der Transaktion stets dem Schreib-Zeitstempel des Objektes sein muß Beim Schreiben eines Objektes (Update) muß der Transaktions-TS sowohl größer als der Lese- als auch größer als der Schreib-Zeitstempel des Objektes sein Hierdurch wird sowohl gegen Leser als auch gegen Schreiber korrekt synchronisiert Nur-Lese-Transaktionen können Update-Transaktionen hierdurch jedoch zum "Absturz" bringen, auch wenn keine Verklemmung vorliegt Einbringung der Änderungen muß "en bloc" und exklusiv am Transaktionsende erfolgen, sonst Gefahr des kaskadierenden Zurücksetzens 8. Synchronisationsverfahren 8-9
Erweitertes Zeitstempelverfahren: Wie vorher, jedoch Absicherung der "Schreib-Phase" Ansatz: Einführung von "Sperr-Aktionen" (lock) lock(x) entspricht einer exklusiven Sperre auf x Werden alle Sperr-Aktionen akzeptiert, so werden die anschließenden Schreib-Aktionen ebenfalls akzeptiert Während der Sperrung von Objekt x eintreffende Read-, Writeund Lock-Aktionen für x werden blockiert read_queue(x) write_queue(x) lock_queue(x) 8. Synchronisationsverfahren 8-10
Algorithmus 8-: Erweitertes Zeitstempelverfahren CASE action OF read: IF TS(T) < TSW(x) THEN reject read ELSE IF lock_queue TS(T) > min { TS(T') T' lock_queue(x) } THEN füge read in read_queue(x) ein ELSE BEGIN führe read aus; TSR(x) := max { TSR(x), TS(T) } END; lock: IF TS(T) < max { TSR(x), TSW(x) } THEN reject lock ELSE füge lock in lock_queue(x) ein; write: lr_queue(x) ::= lock_queue(x) read_queue(x); IF TS(T) > min { TS(T') T' lr_queue(x) } THEN füge write in write_queue(x) ein ELSE BEGIN führe write aus; entferne korrespond. lock aus lock_queue(x) TSW(x) := TS(T); teste read_queue(x) und write_queue(x) auf ausführbare Aktionen; END; END CASE; 8. Synchronisationsverfahren 8-11
Anmerkungen: Zur Read-Aktion: Der Zeitstempel der Read-Aktion muß grundsätzlich aktuell in bezug auf den Schreib-Zeitstempel des Objektes sein (wie beim einfachen Verfahren) Ob die Read-Aktion sofort oder verzögert ausgeführt wird, hängt davon ab, ob für dieses Objekt bereits ein Lock-Request mit niedrigerem Zeitstempel vorliegt. In diesem Fall wird das Lesen verzögert (und der Read-Request in die read_queue eingefügt), andernfalls wird das Lesen sofort ausgeführt Zur Lock-Aktion: Wie der Write-Zeitstempel beim einfachen Verfahren muß der Lock-Zeitstempel in bezug auf beide Objekt-Zeitstempel aktuell sein. Analog zu einer "Sperre" führt die Lock-Aktion keine Objekt- Veränderungen durch, sondern wird lediglich beim Objekt eingetragen Die lock_queue entspricht damit einer lock_request_queue beim Zwei-Phasen-Sperren Zur Write-Aktion: Da - analog zum exklusiven Sperren - die entsprechende Schreib-Aktion vom Scheduler stets akzeptiert wird, geht es hier nur noch darum, ob das Schreiben sofort ausgeführt oder verzögert wird. Das Schreiben wird stets dann verzögert, wenn noch locks oder reads mit kleinerer Zeitmarke vorliegen, die zunächst abgearbeitet werden müssen. Nach Ausführung der Schreib-Aktion wird die exklusive Sperre aufgehoben (d.h. es erfolgt die Entnahme aus der lock_queue). 8. Synchronisationsverfahren 8-1
Evtl. werden hierdurch andere Aktionen ausführbar. Beispiel 8-1 zum erweiterten Verfahren: Gegeben seien die folgenden Transaktionen: T 1 : read 1 [x] lock 1 [x] write 1 [x] T : read [x] lock [x] write [x] T 3 : read 3 [y] lock 3 [x] write 3 [x] Es ergebe sich folgende Schedule: 1 read 1 [x] read 3 [y] lock 1 [x] 3 read [x] 4 write 1 [x] 5 6 lock [x] 8 lock 3 [x] write 3 [x] 9 write [x] 10 Zeit Abb. 8-3: Mögliche Schedule für Aktionen von T 1.. T 3 8. Synchronisationsverfahren 8-13
Entwicklung der Zeitstempelwerte für Objekt x: Zeitpunkt TSR read_queue lock_queue TSW write_queue 0 0 0 1 1 { 1 } 3 { } 4 1 5 6 { } {, 3 } 8 { 3 } 9 { 3 } 10 3 Anmerkungen: Ohne Betrachtung von (Zwei-Phasen)-Commit bei EOT Das einfache und das erweiterte Zeitstempel-Verfahren sind nicht ganz so mächtig (# möglicher Schedules) wie das Zwei- Phasen-Sperren. Es sind jedoch weitere Verbesserungen möglich, so daß auch Schedules erzeugbar sind, die bei Zwei-Phasen-Sperren nicht erzeugbar wären, eine direkte Vergleichbarkeit der Mächtigkeit ist jedoch nicht gegeben. 6 Mit Betrachtung von (Zwei-Phasen-)Commit Zwei-Phasen-Sperren besser. 6 Vgl. P. Dadam: Synchronisation und Recovery in verteilten Datenbanken: Konzepte und Grundlagen. Dissertation, FernUniversität Hagen, 199 8. Synchronisationsverfahren 8-14
8.3.3 Semantische Synchronisationsverfahren Erhöhung der Parallelität durch Einführung kommutativer ("semantischer") DB-Operationen als Einheit für die Synchronisation Beispiel 8-: Zwei Kontobuchungen auf den Konten K 1 und K durch die Transaktionen T 1 und T, die kommutative Operationen erhöhe um x und vermindere um x verwenden, könnten z. B. in den Reihenfolgen Schedule S 1 Schedule S 1. erhöhe(t 1,K 1,x 1 ). vermindere(t 1,K,x 1 ) 3. erhöhe(t,k 1,x ) 4. vermindere(t,k,x ) 1. erhöhe(t 1,K 1,x 1 ). erhöhe(t,k 1,x ) 3. vermindere(t 1,K,x 1 ) 4. vermindere(t,k,x ) ausgeführt werden. Schedule S 1 wäre auch mit rein syntaktischen Verfahren erzeugbar: < r 1 [K 1 ] w 1 [K 1 ] r 1 [K ] w 1 [K ] r [K 1 ] w [K 1 ] r [K ] w [K ] >. erhöhe(t 1,K 1,x 1 ) vermindere(t 1,K,x 1 ) erhöhe(t,k 1,x ) vermindere(t,k,x ) Schedule S wäre hingegen mit rein syntaktisch arbeitenden Verfahren nicht erzeugbar. 8. Synchronisationsverfahren 8-15
8.4 Erkennung und Auflösung von Verklemmungen Alternativen: Vorgabe von Zeitschranken ("time out") verklemmungsvermeidende Verfahren optimistische Verfahren (siehe Abschnitt 8.) verklemmungsvermeidende Sperrverfahren (siehe Abschnitt 8.3.1) Zeitstempelverfahren (siehe Abschnitt 8.3.) explizite Analyse auf Verklemmungen (Deadlocksuche; deadlock detection) T 1 wartet auf T' 3 wartet auf T 3 wartet auf wartet auf T T" Knoten A wartet auf wartet auf Knoten B T' Knoten C Abb. 8-4: Beispiel für globale Verklemmung 8. Synchronisationsverfahren 8-16
8.4.1 Zentralisierte Deadlock-Suche Erstellung einer globalen Wartet-auf-Matrix (WA-Matrix) an einem ausgewählten Knoten Deadlock-Suche und Auflösung wie im zentralen Fall 8.4. Dezentrale Deadlock-Suche Dezentrale (verteilte) Deadlock-Suche: Im Prinzip nehmen alle Knoten am Suchprozeß teil WA-Information wird oft weiter vergröbert, um Kommunikationsaufwand zu sparen z.b. T global,1 T lokal T global, wird oft reduziert zu: T global,1 T global, Dadurch jedoch Gefahr von Pseudo-Verklemmungen ( unnötige Zurücksetzungen) 8. Synchronisationsverfahren 8-1
Mögliche Vorgehensweise: Jeder lokale WAG enthält genau einen externen Ein-/Ausgang ( ) Externe WA-Beziehungen werden bzgl. lokalem formuliert T 1 T' 3 T 3 T 1 T' 3 T 3 T T" T T" Knoten A Knoten A T' Knoten B T' Knoten B Knoten C Knoten C Abb. 8-5: "Echter" globaler WAG Abb. 8-6: Lokale WAGs Kritisch sind Zyklen der Form..., da sie auf einen möglichen globalen Deadlock hinweisen Information über solche Zyklen werden anderen Knoten verschickt ( String) Beispiel: T 1 T T 5 wird zum String: ",1,,5" In Anlehnung an das Verfahren von R. Obermark: Distributed Deadlock Detection Algorithm. ACM Transaction on Database Systems, June 198, Vol., No., pp. 18-08 8. Synchronisationsverfahren 8-18
Algorithmus 8-3: "Distributed Deadlock Detection" (DDD) 1. Konstruiere den lokalen WAG (wie eben beschrieben). Gehe zu Schritt 5. Falls Strings und Deadlock-Information von anderen Knoten eintreffen, so werden sie im lokalen WAG wie folgt berücksichtigt: a. Alle Knoten und Kanten von Deadlock-Opfern werden aus dem WAG entfernt. b. Alle Strings, die ein bereits bekanntes Deadlock-Opfer enthalten, werden ignoriert. c. Noch nicht bekannte Transaktionen werden eingefügt. d. Für die im String enthaltenen Nachfolger-Transaktionen werden im WAG ggf. Pfeile hinzugefügt. 3. Füge für jede Transaktion T im WAG, auf deren Nachricht eine nicht-lokale Transaktion wartet, dem WAG eine T - Kante hinzu (sofern noch nicht vorhanden). 4. Füge für jede Transaktion T' im WAG, die auf eine Nachricht einer nicht-lokalen Transaktion wartet, dem WAG eine T' - Kante hinzu (sofern noch nicht vorhanden). 5. Analysiere den WAG und erstelle eine Liste aller elementaren Zyklen (im folgenden kurz Zyklenliste genannt). Die nachfolgenden Schritte beziehen sich nur noch auf die Zyklenliste: 6. Ermittle alle Zyklen in der Zyklenliste, die nicht den Knoten enthalten, und wähle daraus jeweils eine Transaktion T v als Deadlock-Opfer aus. 8. Synchronisationsverfahren 8-19
. Entferne T v (falls vorhanden) aus dem WAG sowie alle Kanten, die von T v ausgehen oder in T v einmünden. Entferne alle Strings (und die darauf basierenden Zyklen), die T v enthalten. 8. Informiere (falls T v eine globale Transaktion war) die anderen Knoten über das Zurücksetzen von T v. In der Zyklenliste sind jetzt nur noch Zyklen mit enthalten: 9. Ermittle die Zyklen T i... T j in der Zyklenliste für die gilt: Zykluslänge > und TransID(T i ) > TransID(T j ) 8. a. Transformiere diese Zyklen in einen String (wie oben beschrieben). b. Sende den String zu dem Knoten, auf dessen Nachricht die letzte Transaktion im String wartet. Gehe zu Schritt. 8 Es werden also keine Strings der Form ",1,3,4,..." erzeugt (zur Vermeidung von Mehrfach- Übertragungen). Bei der Berechnung der Zykluslänge werden die -Knoten jeweils nur einfach gezählt. 8. Synchronisationsverfahren 8-0
Beispiel 8-3: Gegeben sei folgende globale "Wartet-auf"-Situation: T 1 T ' T 3 Knoten A T " T 6 T T 3 ' T 4' T 4 T T ' Knoten B T 8' T 8 Knoten C Abb. 8-: Im Beispiel unterstellte globale WA-Situation Anmerkungen zu Abb. 8- : T " habe bereits den RtC-Zustand erreicht und warte nun auf die COMMIT- oder ABORT-Meldung von T ' T ' müsse ein Objekt exklusiv sperren warte auf die Freigabe der von T 3 und T " gehaltenen Lesesperren für dieses Objekt (analoges gilt für T 4 ' bzgl. T und T 6 sowie für T ' bzgl. T 3 ' und T 8 ) 8. Synchronisationsverfahren 8-1
Bei Reduzierung auf Beziehungen zwischen den globalen Transaktionen (als Ganzes) ergibt sich folgendes Bild: T4 T 6 T1 T T 3 T T 8 Abb. 8-8: WAG bei zentraler Deadlock-Erkennung Elementare Zyklen: 9 T T 3 T 4 T Z1) T T T 3 T 4 T T T 8 T (Z) (Z3) 9 Der Zyklus T T T 8 T T 3 T 4 T ist kein elementarer Zyklus, sondern ergibt sich durch Zusammensetzung aus den Zyklen (Z1) und (Z3) 8. Synchronisationsverfahren 8-
Knoten A Knoten B Knoten C 1. Input: Deadlocksuche! Input: Deadlocksuche! Input: Deadlocksuche! 8 8 4 1 3 4 6 3 Analyse:,,3,,,, Output: -- 10 Analyse:,4,,,8,, Output:,4,,8, A C Analyse:,3,4,,,8,,,3,4, Output:,,3,4 B Abb. 8-9: Deadlockerkennung 1. Iteration 10 Wird nicht verschickt, da TransID first < TransID last (siehe Regel 9 des DDD-Algorithmus ). 8. Synchronisationsverfahren 8-3
. Input: B:,4, Knoten A Knoten B Knoten C Input: C:,,3,4 Input: B:,8, 4 8 8 4 1 3 3 4 6 3 Analyse:,,3,,,,,4,,3,,4,,, Analyse:,4,,,,,,3,4,,,8,,,8,,3,4,, Analyse:,3,4, (,,8, ) 11,,3,4, (,8, ) (,8,,3,4, ) (,8, ) Zyklus! Opfer = 8 8 4 3 4 3 Output:,4,,3 C Output:,4, A 1,,3,4, A,8,,3,4, A,8, C Output:,,3,4 B Opfer = 8 A, B Abb. 8-10: Deadlockerkennung. Iteration 11 ( ) steht für: Zyklus durch Wahl eines Opfers für Transaktionsabbruch aufgelöst. 1 steht für: Braucht nicht mehr verschickt zu werden, da bereits schon einmal verschickt. 8. Synchronisationsverfahren 8-4
Knoten A Knoten B Knoten C 3. Input: B:,,3,4, B:,8,,3,4, 13 C: Opfer = 8 Input: C: Opfer = 8 Input: A:,4,,3 4 8 4 1 3 3 4 6 3 3 4 6 Analyse: (,,3, ),,, (,,,3, ) (,4,,3, ),4,,, (,4,,,3, ) (,,3, ),, (,3,4, ) Zyklus! (,,3,4, ) Zyklus! Opfer = 3 Analyse:,4,,,,,,3,4,, Analyse: (,3,4, ),4, (,,3,4, ) (,3,4, ) Zyklus! Opfer = 3 4 4 1 3 3 Output: Opfer = 3 B, C Output:,,3,4,,4, A A Output: Opfer = 3 A, B Abb. 8-11: Deadlockerkennung 3. Iteration 13,... steht für Input-String wird ignoriert, da Deadlock-Opfer darin enthalten. 8. Synchronisationsverfahren 8-5
Knoten A Knoten B Knoten C 4. Input: C: Opfer = 3 Input: A: Opfer = 3 C: Opfer = 3 Input: A: Opfer = 3 4 4 1 3 4 6 4 6 Analyse:,,,,4,,,,, Analyse:,4,,,, Analyse:,4, Output: -- Output: -- Output: -- Abb. 8-1: Deadlockerkennung 4. Iteration Im 4. Iterationssschritt findet keiner der Knoten mehr einen zu versendenden String und die Deadlocksuche ist damit beendet. Anmerkung: Man kann zeigen, daß der DDD-Algorithmus einen Zyklus, in N* (N 1) dem N Knoten involviert sind, in maximal Schritten findet. 14 14 siehe hierzu R. Obermark: Distributed Deadlock Detection Algorithm. ACM Transaction on Database Systems, June 198, Vol., No., pp. 18-08 8. Synchronisationsverfahren 8-6
Übungsaufgabe 8-1: Deadlocksuche Gegeben seien die folgenden Transaktionen mit den dargestellten WA- Beziehungen. Führen Sie eine Deadlocksuche mit dem DDD-Algorithmus durch. T ' 9 Knoten A T 9 Knoten B T3 T 1 T ' 1 T 8' T " 5 T 5 T ' T 4 T 8 T ' 5 T T ' 4 T T 6 Knoten C Abb. 8-13: Globale WA-Situation Musterlösung siehe P. Dadam: Verteilte Datenbanken und Client/Server-Systeme. 8. Synchronisationsverfahren 8-
8.5 Ergänzende Literatur P. Dadam: Verteilte Datenbanken und Client/Server-Systeme,... Gray, Reuter (siehe Basis-Literatur) Özsu, Valduriez (siehe Basis-Literatur) Ceri, Pelagatti (siehe Basis-Literatur) P. Dadam: Synchronisation in verteilten Datenbanken: Ein Überblick, Informatik-Spektrum, Teil 1: Band 4, 1981, S. 15-184, Teil : Band 4, 1981, S. 61-0 8. Synchronisationsverfahren 8-8