Concurrency Control
Historie muss mindestens konfliktserialisierbar sein - meistens auch strikt.
Sperrbasierte Synchronisation
Verträglichkeits- / Kompatibilitäts-Matrix
no lock
shared - read lock
exclusive - write lock
Bei MGL
intention shared lock - tiefer in Hierarchie
intention exclusive lock - tiefer in Hierarchie
2PLs
Zwei-Phasen-Sperrprotokoll 2PL
- Jedes Objekt muss vor der Verwendung locked werden
- Es darf nicht ein lock angefordert werden, wenn man sie bereits besitzt
- locks werden nach Kompatibilitätsmatrix gewährt wenn man nicht blockiert ist
-
Nach einem unlock, ist kein Anfordern von locks erlaubt (2 Phasen)
Wachstumsphase → Schrumpfungsphase
- Beimüssen alle Sperren freigegeben werden
erzeugt konfliktserialisierbare Historien (ohneseriell)
Strict 2PL
- Alle unlocks müssen bisblockiert und dann aufeinmal ausgeführt werden.
erzeugt strikte Historien
Conservative 2PL (= Preclaiming)
- Alle unlocks müssen bisblockiert und dann aufeinmal ausgeführt werden.
- Alle locks müssen beiaufeinmal ausgeführt werden.
Variante von strict 2PL
Transaktionen nur gestartet wenn sie alle ihre locks von Anfang an bekommen
Vermeidet deadlocks
Deadlocks
Bei 2PLs sind deadlocks möglich.
Sie lassen sich mit conservative 2PL oder Zeitstempelverfahren vermeiden.
Beispiel
Erkennung
Time-out Strategie
Einfache Methode
innerhalb einer Zeitspanne keine Fortschritte gemacht werden
timeout zu klein - unnötige s
timeout zu groß - deadlocks zu spät erkannt
Wartegraph
Exakte Methode
gerichtete Kante falls auf wartet.
Deadlock = Zyklus um Graph
Knoten entfernen um Zyklus aufzulösen
Zeitstempelverfahren
Jede Transaktion hat Zeitstempel zB vergangene Sekunden oder counter
Jüngere Transaktionen = größere Zeitstempel
älter als
Zeitstempel entscheidet ob Transaktion auf lock wartet oder ed wird.
Angenommen will lock den besitzt.
wound-wait Strategie: ältere Transaktion (kleinere Zahl) setzt sich durch
- Wenn älter wird ed
- Wenn älter wartet bis Freigabe
wait-die Strategie: jüngere Transaktion (größere Zahl) setzt sich durch
- Wenn älter wartet bis Freigabe
- Wenn älter wird ed
Granularität von Sperren
Multiple Granularity Locking (MGL)
kleinere Sperrgranulate → verbesserte Effizienz:
Datensatz Tabelle Seite Segment / area (logisch zusammengehörende pages) Datenbasis
Anforderung: bei lock müssen Kinder auch gelocked werden
Freigabe: nur möglich wenn Kinder auch freigegeben wurden
Delete - -lock
Andere Transaktionen die ein lock für das Objekt wollen, werden es nach dem der Transaktion nicht mehr erhalten.
Insert - -lock
Sollte vermieden werden:
Phantomproblem (Indexbereich sperren).
Konfliktserialisierbar serialisierbar bei Inserts.
Zeitstempel-basierende Synchronisation
keine Deadlocks
erzeugt konfliktserialisierbare Historie (deshalb kein erlaubt)
Vor jedem Zugriff timestamp abfragen - sich bei Konflikt en.
Umzu ermöglichen
Rücksetzbare Historie
blockieren bis alle Transaktionen von denen gelesen wurde beendet sind.
Strikte Historie
- alle Schreib-Operationen am Ende atomar ausführen.
-
Dirty-bit
true
= Datensatz von aktiver Transaktion geschriebenkein kaskadierendes Rücksetzen: Schreiben für andere blockieren wenn
true
.strikte Historie: Schreiben und Lesen für andere blockieren wenn
true
.Nach die dirty-bits auf
false
setzen.Nach - wenn die Transaktion davor ed hat - die dirty-bits aktualisieren und zurücksetzen.
Definition
Jede Transaktion hat timestamp zB vergangene Sekunden oder counter
Jüngere Transaktionen = größere Zeitstempel
älter als
Jedes Datenobjekt hat 2 timestamps zum abfragen:
TS der jüngsten Transaktion die gelesen hat
TS der jüngsten Transaktion die geschrieben hat
Lesezugriff
ist älter als anderer der geschrieben hat.
Das bedeutet der ursprünglichen Reihenfolge der Transaktionen zufolge, müsste vor der Schreiboperation gelesen haben. - Das trifft nicht zu.
wird zurückgesetzt.
ist jünger oder gleich alt wie anderer der geschrieben hat.
Das bedeutet der ursprünglichen Reihenfolge der Transaktionen zufolge, müsste nach der Schreiboperation gelesen haben. - Das trifft zu.
darf lesen.
Schreibzugriff
ist älter als anderer der geschrieben hat.
Das bedeutet der ursprünglichen Reihenfolge der Transaktionen zufolge, müsste vor der Schreiboperation geschrieben haben. - Das trifft nicht zu.
wird zurückgesetzt.
ist älter als anderer der gelesen hat.
Das bedeutet der ursprünglichen Reihenfolge der Transaktionen zufolge, müsste vor der Leseoperation geschrieben haben, damit die andere Transaktion diesen Wert liest. - Das trifft nicht zu.
wird zurückgesetzt.
und
ist jünger oder gleich alt wie anderer der geschrieben oder gelesen hat.
darf schreiben.
Transaktionsverwaltung mit SQL
SET TRANSACTION
[ READ WRITE | READ ONLY ]
[ ISOLATION LEVEL {
READ UNCOMMITED | READ COMMMITED | REPEATABLE READ | SERIALIZABLE
}]
READ UNCOMMITED
Schwächste Stufe.
Nicht festgeschriebene, inkonsistente Änderungen können gelesen werden.
Nur für
READ ONLY
erlaubt.
READ COMMITED
Nur Daten können gesehen werden die vor der Operation commited waren.
REPEATABLE READ
Nur Daten können gesehen werden die vor der Transaktion commited waren.
SERIALIZABLE
Höchste Stufe.