Datenbanksysteme Klausurvorbereitung

Transaktionen

ACID-Bedingungen

BedingungBeschreibung
Atomicity- Transaktion ist kleinste, atomare Ausführungseinheit
- Entweder alle Änderungen durch Transaktion in der Datenbasis werden wirksam oder gar keine
Consistency- Transaktion überführt Datenbank von konsistentem Zustand in anderen konsistenten Zustand
- (Inkonsistenzen innerhalb Transaktionen erlaubt)
Isolation- Transaktion ist gegenüber anderen Transaktionen isoliert
- Ergebnis einer Transaktion kann nicht direkt durch andere Transaktionen beeinflusst werden
- Jede Transaktion wird logisch so ausgeführt, als gäbe es keine andere Transaktion
Durability- Wirkung einer Transaktion auf Datenbasis bleibt nach erfolgreichem Abschluss dauerhaft erhalten
- auch bei Systemfehlern

 

Ausführungspläne

Beispiel

Elementaroperationen

OperationBeschreibung
.bot()Initialisierung (wird oft nicht explizit genutzt)
.r(a)
.read(a, var_A)
Lesen von Objekt a und Übergabe an Programmvariable A
.w(b)
.write(b, var_B)
Schreiben von Programmvariable B in Objekt b
.a()
.abort()
Abbruch der Transaktion (alle Änderungen werden unwirksam)
.c()
.commit()
Erfolgreiche Beendigung der Transaktion (Änderungen werden geschrieben)

Ordnungsrelationen

mit Ordnungsrelation H:

auch innerhalb einzelner Transaktionen:

Synchronisationsprobleme

Lost update

Das Gehalt ist zwar eingegangen, aber der neue Kontostand mit Gehalt ist zwischenzeitlich verloren gegangen.

Inkonsistente Sicht auf die Datenbank

Veränderungen können zwischenzeitlich Inkonsistenzen erzeugen, die jedoch bereinigt werden. Ohne entsprechende Isolation werden jedoch andere Transaktionen beeinflusst.

inkonsistente Datenbank

Das zwischenzeitlich erzeugte Guthaben von T1 konnte T2 nutzen, um 100€ auszuzahlen und die Datenbank in einen inkonsistenten Zustand zu bringen.

Phantom-Problem

image-20210712184023816

Die Summenberechnung in T1 berücksichtigt also das n+1-te Element (= Phantomobjekt) nicht.

Serialisierbarkeit

äquivalente Ausführungspläne

Sei eine Menge von Transaktionen mit den Ausführungsplänen G und H.

H und G sind äquivalent, falls ihre Konflikte identisch sind.

Für alle Transaktionen :

serialisierbare Ausführungspläne

Ein Ausführungsplan ist serialisierbar, wenn es einen äquivalenten sequentiellen Ausführungsplan gibt.

Beispiel: (sequentieller Ausführungsplan)

Serialisierbarkeitsgraph

Ein Serialisierbarkeitsgraph sei ein gerichteter Graph mit Knotenmenge und Kantenmenge zur Historie .

Ausführungsplan H ist genau dann serialisierbar, falls zyklenfrei ist.

Beispiel

image-20210712191325428

Konflikte:

image-20210712191547224

Der Graph ist zyklenfrei und damit serialisierbar mit äquivalenten sequentiellen Ausführungsformen:

Es kann nicht mit T2 begonnen werden, da sonst die Konflikte nicht entstünden und der Ausführungsplan damit per Definition nicht äquivalent wäre.

Sperrprotokolle

= präventive Verfahren zur Verhinderung nicht-serialisierbarer Ausführungspläne

Zwei-Phasen Sperrprotokoll (2PL)

image-20210713152054171

Es werden dadurch nur serialisierbare Ausführungspläne erzeugt.

Es können aber Verklemmungen auftreten.

Konservatives 2PL

image-20210713152257716

Problem: kaskadierendes Zurücksetzten

Striktes 2PL

image-20210713152518321

Beispiel
ZeitpunktT1T2Bemerkung
1BOT  
2 BOT 
3lock(A)  
4write(A)  
5 lock(B) 
6 read(B) 
7lock(B) T1 muss auf T2 warten
8 lock(A)T2 muss auf T1 warten
9......Deadlock

RX-Protokoll

(bisher keine Unterscheidung für Schreibe- oder Leseoperationen)

Zwei Sperrmodi:

Recovery

= Fehlerbehandlung, um ACID-Bedingungen zu bewahren

Bei Auftreten eines Fehlers müssen alle Änderungen der abgebrochenen Transaktion rückgängig gemacht werden. Logging

Fehlerklassen

Logging

= Protokollierung aller vorgenommenen Änderungen

Varianten
Write Ahead Logging (WAL-Prinzip)

Protokolleinträge werden im Voraus geschrieben.

  1. Vor einem Commit wurden alle Logs geschrieben
  2. Vor dem Schreiben einer Seite wurden alle Logs geschrieben
  3. Vor dem Schreiben eines Logs wurden alle Logs mit kleineren Sequenznummern geschrieben

Vorgehen bei Systemfehler (Recovery-Ablauf)

  1. Analysephase

    • Identifiziere Winner- (mit Commit abgeschlossen) und Loser-Transaktionen (nicht abgeschlossen)
  2. REDO-Phase

    • Durchlaufe alle Einträge vom Anfang bis zum Ende
    • Wenn : REDO-Operation ausführen und aktualisieren
  3. UNDO-Phase

    • Durchlaufe alle Einträge vom Ende bis zum Anfang

    • Führe UNDO-Operation für alle Loser-Transaktionen durch

    • Schreibe Kompensationseinträge für alle UNDO-Operationen in Log-Datei

      • Aufbau:

        • Sequenznummer

        • Transaktionsnummer

        • Seitenkennung

        • REDO-Operation

          (UNDO-Operation des jeweiligen zu kompensierenden Eintrags)

        • leeres UNDO-Feld

        • Zeiger auf zuletzt ausgeführte UNDO-Operation

Beispiel
ZeitpunktLogische Protokolldatei
......
71<#71, T08, P1, B = B+4, B = B-4, #69>
72<#72, T09, begin_TA, 0>
73<#73, T09, P1, A = A-1, A = A+1, #72>
74<#74, T08, P2, D = D-3, D = D+3, #71>
75<#75, T08, commit, #74>
76<#76, T09, P1, A = A*4, A = A/4, #73>
 CRASH
77<#77, T09, P1, A=A/4, , #73>
78<#78, T09, P1, A=A+1, , #72>

Winner-Transaktion: T08 (wegen commit zu Zeitpunkt 75)

Loser-Transaktion: T09 (weil kein commit)

Sicherungspunkte

Problem/Motivation: Log-Dateien können sehr groß werden

Wiederanlauf startet bei Sicherungspunkt

Varianten
Aktionsbasierte Sicherungspunkte

Puffer werden nach WAL-Prinzip geschrieben. Bei Erzeugung des Sicherungspunktes wird eine Liste mit aktiven Transaktionen und die kleinste LSN (MIN_LSN) aller noch aktiven Transaktionen gespeichert.

Recovery-Ablauf:

Beispiel

image-20210714175520687

Zustand nach REDO-Phase:

Zustand nach UNDO-Phase:

Isolationslevel

Isolationsleveldirty readsdirty writesnon-repeatable readsPhantome
read uncommitedmöglichmöglich
(wenn schreibend)
möglichmöglich
read commitedneinmöglich
(wenn schreibend)
möglichmöglich
repeatable readsneinneinneinmöglich
serializableneinneinneinnein

read uncommited

read commited

repeatable reads

serializable

Beispiel

Relation M

MIdGehalt
M11000
M22000

Transaktion 1 (wird im Isolationslevel SERIALIZABLE ausgeführt)

Transaktion 2

Werte von G1, G2 mit unterschiedlichen Isolationsleveln für T2:

SERIALIZABLE
AusführungsreihenfolgeG1G2
T1 < T241004100
T2 < T130003000
READ COMMITED
AusführungsreihenfolgeG1G2
T1 < T241004100
T2 < T130003000
T2 < T1 < T230004100
READ UNCOMMITED
AusführungsreihenfolgeG1G2
T1 < T241004100
T2 < T130003000
T2 < T1 < T230004100
T2 < T1 < T2 < T130004000
T1 < T2 < T1 < T240004100

Snapshot-Isolation

Ziele:

*=verifizierendes (optimistisches) Verfahren**

(2-Phasen-Sperrprotokoll ist präventives Verfahren)

Zeitstempel-Verfahren

Beispiel

Historie:

image-20210715184705686

initiale Werte:

image-20210715184804554

ZeitpunktTupelVersion (k)Wertread-tswrite-ts
2z2
(weil bei Schreiben neue Version und initial 1)
21
(wird mit write gesetzt)
1
(weil BOT zu Zeitpunkt 1)
4x1
(weil initial 1 und keine Änderung bei Lesen)
13
(weil BOT zu Zeitpunkt 3)
0
(weil initial 0 und keine Änderung bei Lesen)
7y2
(weil bei Schreiben neue Version und initial 1)
56
(wird mit write gesetzt)
6
(weil BOT zu Zeitpunkt 6)
10y3
(weil bei Schreiben neue Version und letzte Version von T2 = 2)
49
(wird mit write gesetzt)
9
(weil BOT zu Zeitpunkt 9)
12x2
(weil bei Schreiben neue Version und initial 1)
811
(wird mit write gesetzt)
11
(weil BOT zu Zeitpunkt 11)
13y4
(weil bei Schreiben neue Version und letzte Version von T3 = 3)
111
(wird mit write gesetzt)
11
(weil BOT zu Zeitpunkt 11)
14y1
(weil BOT von T5 als erstes und somit kein Update bekannt)
3
(weil initial 3 und T5 Stand von Zeitpunkt 1 hat)
1
(weil BOT zu Zeitpunkt 1)
0
(weil initial 0 und keine Änderung bei Lesen)