uni:8:dbs2:synchronisation
Table of Contents
Synchronisation
Pessimistische Synchronisation mit Sperren
Sperrprotokoll
| Nicht Konservativ ( / *) | Konservativ ( | *) |
|
|---|---|---|
Nicht Strikt (* \) | / \ | | \ |
Strikt (* |) | / | | | | |
Konsistenzstufen
- kurz
- lang: Bis EOT
| Konsistenzstufe | Schreibsperre | Lesesperre |
|---|---|---|
| 0 | kurz | - |
| 1 | lang | - |
| 2 | lang | kurz |
| 3 | lang | lang |
Sperrverfahren
Verfahren
(Voll)
| X | |
|---|---|
| X | |
RX
| R | X | |
|---|---|---|
| R | | |
| X | | |
RUX
- U: update/lesen
| R | U | X | |
|---|---|---|---|
| R | | | |
| U | | | |
| X | | | |
Übergänge:
- U → X: Möchte jetzt schreiben
RAX
- A: = U (update/lesen)
| R | A | X | |
|---|---|---|---|
| R | | | |
| A | | | |
| X | | | |
Übergänge:
- A → X: Möchte jetzt schreiben
RIX
Auf oberer Ebene (Tabelle):
| R | X | IR | IX | RIX | |
|---|---|---|---|---|---|
| R | | | | | |
| X | | | | | |
| IR | | | | | |
| IX | | | | | |
| RIX | | | | | |
| Überprüfung auf unterer Ebene nötig |
|---|
- Obere Ebene hat …
- R
- X
- Untere Ebene hat …
- R ⇒ IR
- X ⇒ IX
- Obere Ebene hat R, untere Ebene hat X …
- RIX (mix aus R und IX)
Auf unterer Ebene (Tupel): RX/RUX/RAX
RAC
- A Änderung $V_\text{neu}$ im cache
- C $V_\text{alt}$ wird noch von alten Lesern gelesen
| R | A | C | |
|---|---|---|---|
| R | | | |
| A | | | |
| C | | | |
Übergänge:
- A → C: Bei commit
Eigenschaften
| Verfahren | Kein Verhungern | Deadlockfrei selbes Obj. | Deadlockfrei anderes Obj. | Schedule | Bemerkung |
|---|---|---|---|---|---|
| RX | | | | kaskadierte freies rücksetzen | Parallele Leser |
| RUX | | | | Parallele Leser | |
| RAX | | | | Zwar nach kein verklemmen, dafür verhungern für mehr Parallelität |
Deadlocks
Können entweder
- Vermeiden werden (konservatives 2PL/precaiming) oder
- Erkannt werden
- Wartegraph (Teuer)
- Time-Out
Wartegraph
Ich → warte auf X
Time-Out
| Jüngere TA hält Sperre | Ältere TA hält Sperre | |
|---|---|---|
| Wound-Wait | ⇒ ältere TA “verwundet” (Wound) jüngere TA; jüngere TA wird zurückgesetzt! | ⇒ jüngere TA “wartet” (Wait) |
| Wait-Die | ⇒ ältere TA “wartet” (Wait) | ⇒ ältere TA “tötet” (Die) jüngere TA; jüngere TA wird zurückgesetzt! |
- Es wird immer die Jüngere getötet
- Es wird immer die anfragende warten
- Name: <Jüngere TA hält Sperre>-<Ältere TA hält Sperre>
Pessimistische Synchronisation mit Zeitstempeln
- Jedes Objekt hat Zeitstepel der jüngsten TA pro read/write
- Beim Zugriff prüfen:
| Leser | älter als jüngster Schreiber | des Objekts ⇒ Leser zurücksetzen | $TS(T_i) < \text{writeTS}(O)$ |
| Schreiber | älter als jüngster Schreiber oder Leser | des Objekts ⇒ Schreiber zurücksetzen | $TS(T_i) < \text{writeTS}(O) \vee TS(T_i) < \text{readTS}(O)$ |
Optimistische Synchronisation mit Zeitstempeln
- Änderungen im RAM
- RS und WS der angefassten Objekte pro TA speichern
- Bei Commit validieren, dann raus schreiben
BOCC
Mein RS mit WS, beendeter TA (während meiner TA)
Bei Konflikt:
- Nur ich kann noch zurückgesetzt werden
BOCC+
FOCC
Mein RS mit WS, laufender TA
Bei Konflikt:
- Kill: Ich kill die laufenden TAs
- Die: I die
uni/8/dbs2/synchronisation.txt · Last modified: by 127.0.0.1
