Transaktionen Anforderungen A tomic: Transaktion passiert ganz oder gar nicht C onsistent: Daten wiedersprechen sich nie I solated: Transaktion hängt nicht von anderer T ab D urable: 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: Lesephase Validierungsphase 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: Talt1: Transaktionen, die beendet werden, bevor Tneu in der Lesephase ist Talt2: Transaktionen, die beendet werden, während Tneu in der Lesephase ist 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.