hwr-notes/Datenbanken/Zusammenfassungen/f_Transaktionen - zusammenfassung.md
2026-04-09 11:24:56 +02:00

273 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Transaktionen Zusammenfassung
**Dozent:** A. Zimmermann | HWR Berlin | 2026 | **Folien 131**
---
## 1. Definition (Folien 12)
### Integrität und Transaktionen
**Integrität (Konsistenz)** der Datenbank = Zustand der Daten, in dem sie **korrekt, vollständig und widerspruchsfrei** sind.
**Transaktion** = Mehrere Operationen, die:
- Entweder **alle erfolgreich** durchgeführt werden
- Oder, falls ein Fehler vorliegt, die schon durchgeführten **rückgängig gemacht** werden müssen
### Eigenschaften
- Transaktionen gewährleisten einen **konsistenten Zustand** der Datenbank
- Sie versetzen den Datenbestand von einem konsistenten Zustand in einen **anderen konsistenten Zustand**
- Eine Transaktion wird als **atomare (ununterbrechbare) Operation** betrachtet
- Bei Fehlern werden Komponenten nicht rückgängig gemacht (zeitintensiv), sondern der **zuvor gespeicherte Zustand** wird wiederhergestellt
---
## 2. Beispiel (Folie 3)
Zwei ganze Zahlen A und B (Datenbestand):
```
T1 = { A=A+100; B=B+100; }
T2 = { A=A*2; B=B*2; }
```
- **Sequenzielle Ausführung** → Konsistenz gewährleistet
- **Gemischte Operationen** → Konsistenz **nicht** mehr gewährleistet
---
## 3. Anforderungen (Folien 45)
### Allgemeine Anforderungen (Folie 4)
| Anforderung | Beschreibung |
|---|---|
| Gleichzeitige Verarbeitung | Mehrere Transaktionen müssen **quasi-parallel** verarbeitet werden |
| Fehlerbehandlung | Abgeschlossene Transaktionen bleiben bestehen, offene werden rückgängig gemacht |
| Organisation | Manuell (im Source-Code) oder automatisch |
| Zwischenpunkte | Daten erfolgreich durchgeführter Operationen können gespeichert werden |
| Abschlussarten | Nur **COMMIT** (erfolgreich) oder **ROLLBACK** (erfolglos) |
**Gründe für ROLLBACK:** Systemfehler, Integritätsverletzungen, Deadlock, Benutzeranweisung.
### ACID-Eigenschaften (Folie 5)
| Eigenschaft | Beschreibung |
|---|---|
| **A**tomicity (Atomarität) | Entweder **alle** Befehle oder **gar keine** werden ausgeführt |
| **C**onsistency (Konsistenz) | Transaktion hinterlässt nach Beendigung einen **konsistenten Datenzustand**, ansonsten komplettes Zurücksetzen |
| **I**solation | Nebenläufige Transaktionen beeinflussen sich **nicht gegenseitig**; jede wird logisch so ausgeführt, als wäre sie die einzig aktive |
| **D**urability (Dauerhaftigkeit) | Wirkung einer erfolgreich abgeschlossenen Transaktion bleibt **dauerhaft** erhalten, auch nach Systemfehler |
---
## 4. Zustände einer Transaktion (Folie 6)
```
BoT → Active → Committing → Änderungen festgeschrieben → EoT
↓ ↓
Waiting for ERROR
resources ↓
↓ Rolling back → Änderungen rückgängig gemacht → EoT
DEADLOCK
ROLLBACK → Rolling back
```
| Zustand | Beschreibung |
|---|---|
| **BoT** | Begin of Transaction |
| **Active** | Transaktion führt Operationen aus |
| **Waiting for resources** | Wartet auf gesperrte Ressourcen |
| **DEADLOCK** | Gegenseitige Blockierung erkannt |
| **Committing** | Änderungen werden festgeschrieben (COMMIT) |
| **Rolling back** | Änderungen werden rückgängig gemacht (ROLLBACK) |
| **EoT** | End of Transaction |
---
## 5. Synchronisation (Folien 78)
### Definition
**Synchronisation (Mehrbenutzersynchronisation)** = Koordinierung von mehreren Benutzerprozessen, eng verbunden mit der Ausführung der Transaktionen.
### Ausführungsarten
| Art | Beschreibung | Eigenschaft |
|---|---|---|
| **Seriell** | Transaktionen nacheinander | Absolut sicher, aber **langsam**; blockiert nachfolgende Transaktionen |
| **Parallel** | Transaktionen gleichzeitig | Nutzt Ressourcen **besser** aus |
| **Serialisierung** | Anordnung paralleler Operationen | Entspricht in der Wirkung der seriellen Ausführung, garantiert Konsistenz |
---
## 6. Probleme bei paralleler Ausführung (Folien 926)
### Übersicht (Folie 10)
Bei Zugriff auf **denselben Datenbestand** können folgende Probleme entstehen:
1. **Lost Update**
2. **Dirty Read**
3. **Non-Repeatable Read**
4. **Phantom Read**
Diese Probleme können durch **Isolation** (verschiedene Sicherheitsstufen) vermieden werden.
### Isolationsstufen allgemein (Folie 11)
- Die Isolationsstufe betrifft den **Schreibvorgang nicht** eine Transaktion bekommt immer eine **exklusive Sperre** für alle zu ändernden Daten
- Die Isolationsstufe wirkt auf die **Lesevorgänge** definiert, wie Lesevorgänge von anderen Transaktionen abhängig sind
### 6.1 Lost Update (Folien 1217)
**Problem:** Die von einer Transaktion geänderten Daten werden von einer anderen Transaktion überschrieben.
**Variante 1 Direkt (Folie 12):**
```
T1: update TabX set V=42; T2: ...
T1: ... T2: update TabX set V=53;
T1: ... T2: commit;
T1: commit; T2: ...
```
→ Update von T2 geht verloren. Kommt in Datenbanken **nicht vor**, da T2 auf Freigabe wartet.
**Variante 2 Über lokale Variable (Folie 13):**
```
T1: select V from TabX into W; T2: ...
T1: W := W+1; T2: update TabX set V=53;
T1: update TabX set V=W; T2: commit;
T1: commit; T2: ...
```
→ Update von T2 geht verloren. Kann durch **höhere Isolationsstufe** vermieden werden.
**Lösung:** `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;`
- Die Transaktion merkt sich die Daten, die zum **Start der Transaktion** festgeschrieben waren
- Ändert eine andere Transaktion diese Daten, bricht die erste ab
- Fehler: `ORA-08177: can't serialize access for this transaction`
### 6.2 Dirty Read (Folien 1819)
**Problem:** Eine Transaktion liest Daten, die eine andere Transaktion geändert, aber **noch nicht festgeschrieben** hat.
```
T1: ... T2: update TabX set V=42;
T1: select V from TabX; T2: ... ← T1 liest V=42
T1: ... T2: rollback; ← V=42 war ungültig!
```
**Lösung:** Standard-Isolationsstufe in Oracle ist **READ COMMITTED** → verhindert Dirty Read automatisch.
Dirty Read ist nur möglich mit `READ UNCOMMITTED` (in Oracle nicht verfügbar).
### 6.3 Non-Repeatable Read (Folien 2021)
**Problem:** Eine Transaktion liest **zweimal dieselben Daten** und bekommt **unterschiedliche Ergebnisse**.
```
T1: select V from TabX; T2: ...
T1: ... T2: update TabX set V=42;
T1: ... T2: commit;
T1: select V from TabX; T2: ... ← anderer Wert!
```
**Lösung:** Isolationsstufe **SERIALIZABLE** (Standard READ COMMITTED lässt dies zu).
### 6.4 Phantom Read (Folie 2223)
**Problem:** Ähnlich Non-Repeatable Read, aber mit **Anzahl der Zeilen** statt Werten.
```
T1: select count(*) from TabX; T2: ...
T1: ... T2: insert into TabX ...;
T1: ... T2: commit;
T1: select count(*) from TabX; T2: ... ← anderer Count!
```
**Lösung:** Isolationsstufe **SERIALIZABLE** löst auch dieses Problem in Oracle.
### Trade-off der Isolationsstufen (Folie 24)
| Niedrigere Stufe | Höhere Stufe |
|---|---|
| Erlaubt gleichzeitigen Zugriff | Vermindert Probleme |
| Mehr mögliche Nebenwirkungen | Mehr Systemressourcen |
| Höhere Performance | Höhere Blockierungswahrscheinlichkeit |
### Isolationsstufen nach ANSI/ISO SQL92 (Folien 2526)
| Isolationsstufe | Verhindert | Besonderheit |
|---|---|---|
| **READ UNCOMMITTED** | — | Dirty Read erlaubt; **fehlt in Oracle** |
| **READ COMMITTED** | Dirty Read | Standard in Oracle; Lesesperren werden kurz gesetzt und aufgehoben |
| **REPEATABLE READ** | Dirty Read, Non-Repeatable Read | Sperren für gesamte Transaktion; **fehlt in Oracle** |
| **SERIALIZABLE** | Dirty Read, Non-Repeatable Read, Phantom Read, Lost Update | Höchste Stufe; keine weiteren schreibenden Transaktionen auf dieselben Daten |
**Hinweis:** Der SQL-Standard schreibt diese Stufen vor, aber konkrete Datenbanken unterstützen sie **unterschiedlich**.
---
## 7. Synchronisationsstrategien (Folie 27)
Der **Scheduler** steuert die Ausführungsreihenfolge von Operationen verschiedener Transaktionen.
| Strategie | Beschreibung |
|---|---|
| **Pessimistisch** | Scheduler **verzögert** Operationen, legt optimale Reihenfolge fest |
| **Optimistisch** | Scheduler schickt Operationen **sofort** zur Ausführung |
---
## 8. Synchronisationsverfahren (Folien 2830)
### 8.1 Sperrbasierte Synchronisation (Folie 28)
Wird **oft eingesetzt**. Idee:
| Regel | Beschreibung |
|---|---|
| Jedes Datenobjekt hat eine Sperre | Tabelle, Datensatz, Attribut, Index, View |
| Sperren vor Benutzung | Jedes Objekt muss vor Zugriff gesperrt werden |
| Warten bei Sperre | Ist Objekt schon gesperrt, muss die Transaktion warten |
| Exklusivität | Nur **eine** Transaktion kann die Sperre halten |
| **Lesesperre** (shared lock) | Andere Transaktionen dürfen die Daten **lesen** |
| **Schreibsperre** (exclusive lock) | Andere Transaktionen dürfen Daten **weder lesen noch ändern** |
| Sperren aufheben | Am Ende der Transaktion werden **alle Sperren** aufgehoben |
**Löst:** Alle Probleme **außer Phantom Read**.
### 2-Phasen-Sperrprotokoll 2PL (Folie 29)
| Phase | Beschreibung | Sicherste Variante |
|---|---|---|
| **Wachstumsphase** | Viele Sperren werden **angefordert**, wenige freigegeben | Sperren werden nur **gesetzt**, nicht aufgehoben |
| **Minderungsphase** (Schrumpfphase) | Viele Sperren werden **freigegeben**, wenige angefordert | Sperren werden nur **aufgehoben**, nicht gesetzt |
### 8.2 Zeitstempelbasierte Synchronisation (Folie 30)
Wird **selten eingesetzt**. Idee:
| Regel | Beschreibung |
|---|---|
| Eindeutiger Zeitstempel | Jede Transaktion bekommt einen eindeutigen Zeitstempel |
| Ordnung | Scheduler ordnet konkurrierende Operationen nach Zeitstempel |
| Objektstempel | Zu jedem Datenobjekt wird der Zeitstempel der letzten Operation gespeichert |
| Abweisung | Operation mit **früherem** Zeitstempel als der des Objektes wird **abgewiesen** |
| Reihenfolge | Transaktionen müssen laut Zeitstempelreihenfolge beendet werden |
**Löst:** Alle Probleme **außer Phantom Read**.
---
## Zusammenfassung
| Konzept | Beschreibung |
|---|---|
| **Transaktion** | Atomare Operation: alles oder nichts (COMMIT/ROLLBACK) |
| **ACID** | Atomicity, Consistency, Isolation, Durability |
| **Lost Update** | Überschreiben von Änderungen → SERIALIZABLE |
| **Dirty Read** | Lesen nicht festgeschriebener Daten → READ COMMITTED |
| **Non-Repeatable Read** | Unterschiedliche Leseergebnisse → SERIALIZABLE |
| **Phantom Read** | Geänderte Zeilenanzahl → SERIALIZABLE |
| **Sperrbasiert (2PL)** | Wachstums- und Schrumpfphase, shared/exclusive locks |
| **Zeitstempelbasiert** | Ordnung nach Transaktions-Zeitstempeln |