Skip to main content

Transaktionen

Anforderungen

  • Atomic: Transaktion passiert ganz oder gar nicht
  • Consistent: Daten wiedersprechen sich nie
  • Isolated: Transaktion hängt nicht von anderer T ab
  • Durable: Was commitet ist, ist dauerhaft gespeichert und überlebt einen Crash

Konzepte

  • Historie: Abfolge von Operationen ???
  • serialisierbar: Transaktionen lassen sich in eine eindeutige Reihenfolge bringen
  • Konflikt: Operationen auf dem selben Objekt und mindestens eine Operation ist ein write
  • Präzedenzgraf
    • 1 -> 2 -> 3 ist serialisierbar und legal
    • 1 -> 2 -> 3 -> 2 enthält einen Kreisschluss und ist damit nicht serialisierbar

Fehlerklassen

  • dirty read
  • lost update

2-Phasen-Sperrprotokoll

Legalität:

Vor dem Lesen oder Schreiben eines Objektes muss immer eine Lese- oder Schreibsperre geholt werden. Eine Schreibsperre impliziert immer auch eine Lesesperre. Alle Sperren werden nach den Operationen wieder freigegeben.

Sperr-Regel:

Es darf nur entweder eine Schreibsperre oder beliebig viele Lesesperren auf ein Objekt gleichzeitig geben.

Zweiphasigkeit:

Die Anzahl der Sperren muss in der ersten Phase monoton zunehmen und in der zweiten Phase monoton abnehmen. Keine Sperre darf freigegeben werden, bevor die letzte angefordert wurde.

Um das Phantomproblem zu umgehen, sind Sperren logisch und beziehen sich nicht auf konkrete Tupel.

Parallele Validierung

Eine Transaktion hat drei Phasen:

  1. Lesephase
  2. Validierungsphase
  3. Schreibphase

Transaktionen werden anhand des Endes ihrer Lesephase sortiert und müssen gegen alle älteren Transaktionen validieren, damit die zunächst auf einer lokalen Kopie vorgenommenen Änderungen in die Datenbank geschrieben werden. Schlägt die Validierung fehl, werden sie neu gestartet.

Validierungsphase von Tneu

Tneu unterteilt alle älteren Transaktionen in 3 Gruppen:

  1. Talt1: Transaktionen, die beendet werden, bevor Tneu in der Lesephase ist
  2. Talt2: Transaktionen, die beendet werden, während Tneu in der Lesephase ist
  3. Talt3: Transaktionen, die beendet werden, nachdem Tneu in der Lesephase war

Validierung liefert genau dann true, wenn es keine Transaktion aus Talt2 gibt, deren writeSet eine Schnittmenge mit dem readSet(Tneu) hat und wenn es außerdem keine Transaktion aus Talt3 gibt, deren writeSet eine Schnittmenge mit der Vereinigung vom readSet(Tneu) und dem writeSet(Tneu) hat.