Beispielszenarien 12. Transaktionen ■ Transaktionsbegriff ■ Probleme im Mehrbenutzerbetrieb ■ Serialisierbarkeit ■ Sperrprotokolle zur Synchronisation ■ Isolationsebenen in SQL ■ Platzreservierung für Flüge quasi gleichzeitig aus vielen Reisebüros → Platz könnte mehrfach verkauft werden, wenn mehrere Reisebüros den Platz als verfügbar identifizieren ■ überschneidende Kontooperationen einer Bank ■ statistische Datenbankoperationen → Ergebnisse sind verfälscht, wenn während der Berechnung Daten geändert werden VL Datenbanken I – 12–1 VL Datenbanken I – 12–2 ACID-Eigenschaften Transaktion Eine Transaktion ist eine Folge von Operationen (Aktionen), die die Datenbank von einem konsistenten Zustand in einen konsistenten, eventuell veränderten, Zustand überführt, wobei das ACID-Prinzip eingehalten werden muss. ■ Atomicity (Atomarität): Transaktion wird entweder ganz oder gar nicht ausgeführt ■ Consistency (Konsistenz oder auch Integritätserhaltung): Datenbank ist vor Beginn und nach Beendigung einer Transaktion jeweils in einem konsistenten Zustand ■ Isolation (Isolation): Nutzer, der mit einer Datenbank arbeitet, sollte den Eindruck haben, dass er mit dieser Datenbank alleine arbeitet ■ Durability (Dauerhaftigkeit / Persistenz): nach erfolgreichem Abschluss einer Transaktion muss das Ergebnis dieser Transaktion „dauerhaft“ in der Datenbank gespeichert werden Aspekte: ■ Semantische Integrität: Korrekter (konsistenter) DB-Zustand nach Ende der Transaktion ■ Ablaufintegrität: Fehler durch „gleichzeitigen“ Zugriff mehrerer Benutzer auf dieselben Daten vermeiden VL Datenbanken I – 12–3 VL Datenbanken I – 12–4 Kommandos einer Transaktionssprache ■ Beginn einer Transaktion: Begin-of-Transaction-Kommando BOT (in SQL implizit!) ■ commit: die Transaktion soll erfolgreich beendet werden ■ abort: die Transaktion soll abgebrochen werden Transaktion: Integritätsverletzung ■ Beispiel: Übertragung eines Betrages B von einem Haushaltsposten K1 auf einen anderen Posten K2 ◆ Bedingung: Summe der Kontostände der Haushaltsposten bleibt konstant ◆ ■ vereinfachte Notation Transfer = < K1:=K1-B; K2:=K2+B >; ■ Realisierung in SQL: als Sequenz zweier elementarer Änderungen ; Bedingung ist zwischen den einzelnen Änderungsschritten nicht unbedingt erfüllt! VL Datenbanken I – 12–5 Vereinfachtes Modell für Transaktion Repräsentation von Datenbankänderungen einer Transaktion ■ read(A,x): weise den Wert des DB-Objektes A der Variablen x zu ■ write(x, A): speichere den Wert der Variablen x im DB-Objekt A VL Datenbanken I – 12–6 Probleme im Mehrbenutzerbetrieb ■ Inkonsistentes Lesen: Nonrepeatable Read ■ Abhängigkeiten von nicht freigegebenen Daten: Dirty Read ■ Das Phantom-Problem ■ Verlorengegangenes Ändern: Lost Update Beispiel einer Transaktion T : read(A, x); x := x − 200; write(x, A); read(B , y ); y := y + 100; write(y , B ); VL Datenbanken I – 12–7 VL Datenbanken I – 12–8 Nonrepeatable Read Beispiel für inkonsistentes Lesen Beispiel: ■ T1 Zusicherung X = A + B + C am Ende der Transaktion T1 ■ X und Y seien lokale Variablen ■ Ti ist die Transaktion i ■ T2 X := A; Y := A/2; A := Y ; C := C + Y ; commit; Integritätsbedingung A + B + C = 0 X := X + B ; X := X + C ; commit; VL Datenbanken I – 12–9 Dirty Read T1 VL Datenbanken I – 12–10 Das Phantom-Problem T1 T2 T2 select count (*) into X from Mitarbeiter; read(X ); X := X + 100; write(X ); insert into Mitarbeiter values (M eier, 50000, · · · ); commit; read(X ); Y := Y + X ; write(Y ); commit; update Mitarbeiter set Gehalt = Gehalt +10000/X; commit; abort; VL Datenbanken I – 12–11 VL Datenbanken I – 12–12 Lost Update Einführung in die Serialisierbarkeit T1 T2 X read(X ); read(X ); X := X + 1; X := X + 1; write(X ); write(X ); T1 : read A; A := A − 10; write A; read B; B := B + 10; write B; T2 : read B; B := B − 20; write B; read C; C := C + 20; write C; 10 10 10 10 11 11 Ausführungsvarianten für zwei Transaktionen: ■ seriell, etwa T1 vor T2 ■ „gemischt“, etwa abwechselnd Schritte von T1 und T2 VL Datenbanken I – 12–13 Beispiele für verschränkte Ausführungen Ausführung 1 T1 T2 read A A − 10 write A read B B + 10 write B read B B − 20 write B read C C + 20 write C Ausführung 2 T1 T2 read A read B A − 10 B − 20 write A write B read B read C B + 10 C + 20 write B write C Ausführung 3 T1 T2 read A A − 10 read B write A B − 20 read B write B B + 10 read C write B C + 20 write C VL Datenbanken I – 12–15 VL Datenbanken I – 12–14 Effekt unterschiedlicher Ausführungen A B C A+B+C initialer Wert 10 10 10 30 nach Ausführung 1 nach Ausführung 2 nach Ausführung 3 0 0 0 0 0 20 30 30 30 30 30 50 VL Datenbanken I – 12–16 Serialisierbarkeit Das Read/Write-Modell ■ Eine verschränkte Ausführung mehrerer Transaktionen heißt serialisierbar, wenn ihr Effekt identisch zum Effekt einer (beliebig gewählten) seriellen Ausführung dieser Transaktionen ist. Transaktion T ist eine endliche Folge von Operationen (Schritten) pi der Form r(xi ) oder w(xi ): T = p1 p2 p3 · · · pn mit pi ∈ {r(xi ), w(xi )} ■ Vollständige Transaktion T hat als letzten Schritt entweder einen Abbruch a oder ein Commit c: T = p1 · · · p n a oder T = p1 · · · pn c. VL Datenbanken I – 12–17 VL Datenbanken I – 12–18 Schedule Serieller Schedule Ein Schedule ist ein Präfix eines vollständigen Schedules. Ein serieller Schedule s für T ist ein vollständiger Schedule der folgenden Form: s := Tρ(1) · · · Tρ(n) r1 (x)r2 (x)w1 (x) r2 (y)a1 w2 (y)c2 | {z } ein Schedule | {z } für eine Permutation ρ von {1, . . . , n} resultierende serielle Schedules für zwei Transaktionen T1 := r1 (x)w1 (x)c1 und T2 := r2 (x)w2 (x)c2 : s1 := r1 (x)w1 (x)c1 r2 (x)w2 (x)c2 | {z }| {z } ein vollständiger Schedule T1 T2 s2 := r2 (x)w2 (x)c2 r1 (x)w1 (x)c1 | {z }| {z } T2 VL Datenbanken I – 12–19 T1 VL Datenbanken I – 12–20 Korrektheitskriterium Konflikte T1 Ein Schedule s ist korrekt, wenn der Effekt des Schedules s (Ergebnis der Ausführung des Schedules) äquivalent dem Effekt eines (beliebigen) seriellen Schedules s0 bzgl. derselben Menge von Transaktionen ist (in Zeichen s ≈ s0 ). T2 T1 read A read A read A unabhängig von Reihenfolge T1 Ist ein Schedule s äquivalent zu einem seriellen Schedule s0 , dann ist s serialisierbar (zu s0 ). T2 write A abhängig von Reihenfolge T2 T1 write A write A read A abhängig von Reihenfolge T2 write A abhängig von Reihenfolge VL Datenbanken I – 12–21 Graphbasierter Test Konfliktserialisierbarkeit ■ ■ VL Datenbanken I – 12–22 Zwei Schedules s und s0 heissen konfliktäquivalent, wenn die Reihenfolge von zwei in Koflikt stehenden Operationen in beiden Schedules gleich ist. andernfalls: unterschiedliche Effekte, z.B. Konfliktgraph G(s) = (V, E) von Schedule s: 1. Knotenmenge V enthält alle in s vorkommende Transaktionen 2. Kantenmenge E enthält alle gerichteten Kanten zwischen zwei in Konflikt stehenden Transaktionen w1 (x)w2 (x) vs. (w2 (x)w1 (x) Ein Schedule s ist genau dann konfliktserialisierbar, wenn s konfliktäquivalent zu einem seriellen Schedule ist. VL Datenbanken I – 12–23 VL Datenbanken I – 12–24 Zeitlicher Verlauf dreier Transaktionen T1 T2 Konfliktgraph T3 G(s): r(y) T1 r(u) r(y) w(y) w(x) w(x) w(z) T2 T3 w(x) s = r1 (y)r3 (u)r2 (y)w1 (y)w1 (x)w2 (x)w2 (z)w3 (x) VL Datenbanken I – 12–25 Eigenschaften von Konfliktgraph G(s) VL Datenbanken I – 12–26 Sperrprotokoll 1. Ist s ein serieller Schedule, dann ist der vorliegende Konfliktgraph ein azyklischer Graph ■ Sichern der Serialisierbarkeit durch exklusiven Zugriff auf Objekte (Synchronisation der Zugriffe) 2. Für jeden azyklischen Graphen G(s) lässt sich ein serieller Schedule s0 konstruieren, so daß s konfliktserialisierbar zu s0 ist (Test bspw. durch topologisches Sortieren) ■ Implementierung über Sperren und Sperrprotokolle ■ Sperrprotokoll garantiert Konfliktserialisierbarkeit ohne zusätzliche Tests! 3. Enthält ein Graph Zyklen, dann ist der zugehörige Schedule nicht konfliktserialisierbar VL Datenbanken I – 12–27 VL Datenbanken I – 12–28 Sperrmodelle Kompatibilitätsmatrix Schreib- und Lesesperren in folgender Notation: ■ rl(x): ■ wl(x): ■ für elementare Sperren Lesesperre (engl. read lock) auf einem Objekt x Schreibsperre (engl. write lock) auf einem Objekt rlj (x) wlj (x) x rli (x) wli (x) √ — — — Entsperren ru(x) und wu(x), oft zusammengefaßt u(x) für engl. unlock VL Datenbanken I – 12–29 Sperrdisziplin Verklemmungen ■ Schreibzugriff w(x) nur nach Setzen einer Schreibsperre wl(x) möglich ■ Lesezugriffe r(x) nur nach rl(x) oder wl(x) erlaubt ■ nur Objekte sperren, die nicht bereits von einer anderen Transaktion gesperrt ■ ■ ■ VL Datenbanken I – 12–30 nach rl(x) nur noch wl(x) erlaubt, danach auf x keine Sperre mehr; Sperren derselben Art werden maximal einmal gesetzt nach u(x) durch ti darf ti kein erneutes rl(x) oder wl(x) ausführen t1 wl(x) t2 wl(y) delay → wl(y) wl(x) Verklemmung! ← delay Alternativen: ■ Verklemmungen werden erkannt und beseitigt ■ Verklemmungen werden von vornherein vermieden vor einem commit müssen alle Sperren aufgehoben werden VL Datenbanken I – 12–31 VL Datenbanken I – 12–32 Verklemmungserkennung und -auflösung Wartegraph 6 5 T1 4 2 wl(x) w(x) u(x) wl(y) w(y) u(y) 3 Auflösen durch Abbruch einer Transaktion, Kriterien: ■ Anzahl der aufgebrochenen Zyklen, ■ Länge einer Transaktion, ■ Rücksetzaufwand einer Transaktion, ■ Wichtigkeit einer Transaktion, ... T2 wl(x) w(x) u(x) neue Sperre 1 Sperrprotokolle: Notwendigkeit wl(y) w(y) u(y) VL Datenbanken I – 12–33 #Sperren Zwei-Phasen-Sperr-Protokoll VL Datenbanken I – 12–34 Konflikt bei Nichteinhaltung des 2PL T1 2PL AnforderungsPhase T2 u(x) wl(x) wl(y) .. . FreigabePhase u(x) u(y) Zeit VL Datenbanken I – 12–35 wl(y) .. . VL Datenbanken I – 12–36 S2PL #Sperren Konservatives 2PL-Protokoll #Sperren #Sperren Striktes Zwei-Phasen-Sperr-Protokoll C2PL CS2PL FreigabePhase Zeit Zeit AnforderungsPhase AnforderungsPhase AnforderungsPhase FreigabePhase vermeidet Deadlocks! Zeit Freigabe-Phase vermeidet kaskadierende Abbrüche! VL Datenbanken I – 12–37 VL Datenbanken I – 12–38 Bedeutung der Isolationsebenen Transaktionen in SQL-DBS Aufweichung von ACID in SQL-92: Isolationsebenen set transaction [ { read only | read write }, ] [isolation level { read uncommitted | read committed | repeatable read | serializable }, ] [ diagnostics size ...] Standardeinstellung: ■ read uncommitted ◆ schwächste Stufe: Zugriff auf nicht geschriebene Daten, nur für read only Transaktionen ◆ statistische und ähnliche Transaktionen (ungefährer Überblick, nicht korrekte Werte) ◆ keine Sperren → effizient ausführbar, keine anderen Transaktionen werden behindert ■ read committed (Standard) ◆ nur Lesen endgültig geschriebener Werte, aber nonrepeatable read möglich set transaction read write, isolation level serializable VL Datenbanken I – 12–39 VL Datenbanken I – 12–40 Bedeutung der Isolationsebenen (II) ■ ■ Isolationsebenen (III) repeatable read ◆ kein nonrepeatable read, aber Phantomproblem kann auftreten Isolationsebene serializable ◆ garantierte Serialisierbarkeit ◆ Transaktion sieht nur Änderungen, die zu Beginn der Transaktion committed waren (plus eigene Änderungen) Dirty Unrepeatable Phantom Read Read Read Read Uncommitted + + + Read Committed – + + Repeatable Read – – + Serializable – – – VL Datenbanken I – 12–41 Isolationsebenen: read committed T1 select A from R → alter Wert select A from R → alter Wert VL Datenbanken I – 12–42 Isolationsebenen: serializable T2 T1 update R set A = neu set transaction isolation level serializable T2 set transaction ... update R set A = neu where C = 42 commit commit select A from R → neuer Wert update R set A = neu where C = 42 → Fehler VL Datenbanken I – 12–43 VL Datenbanken I – 12–44 Oracle (I) Oracle (II) ■ Unterstützung der Isolationsebenen Read Committed und Serializable ■ darüber hinaus: Read-Only-Modus (nicht Bestandteil von SQL-92) set transaction isolation level read committed; set transaction isolation level serializable; set transaction isolation level read only; Isolationsebenen für eine Menge von Transaktionen alter session set isolation_level Isolationsebene; Explizite Kommandos zum Setzen von Sperren lock table Tabelle in row share mode; lock table Tabelle in share mode; lock table Tabelle in row exclusive mode; lock table Tabelle in share row exclusive mode; lock table Tabelle in exclusive mode; VL Datenbanken I – 12–45 Oracle: Sperrmodi VL Datenbanken I – 12–46 Oracle: Implizite Sperren Modus Tupel Relation row share row exclusive share share row exclusive exculsive read lock (rl) intended rl write lock (wl) intended wl – rl – read intended wl – wlk VL Datenbanken I – 12–47 select insert/update/delete select...for update commit/rollback → keine Sperre → write lock / row exclusive → read lock / row share → Freigabe aller Sperren VL Datenbanken I – 12–48