Optimistisches und pessimistisches Sperren
Kurz: Beim pessimistischen Sperren sperrt man Daten vor dem Ändern, beim optimistischen prüft man erst beim Speichern, ob jemand dazwischen etwas geändert hat.
Genauer: Beide Verfahren verhindern „verlorene Aktualisierungen”, bei denen zwei Personen denselben Datensatz bearbeiten und die zweite Speicherung die erste überschreibt.
Im Detail
- Pessimistisch:
SELECT ... FOR UPDATEsperrt die Zeile, bis die Transaktion endet. Sicher bei hohem Konflikt, aber andere müssen warten, und es drohen Verklemmungen (Deadlocks). - Optimistisch: Die Zeile hat eine Versionsnummer (oder Zeitstempel). Beim Speichern:
UPDATE ... SET ..., version = version + 1 WHERE id = ? AND version = ?. Wurden 0 Zeilen geändert, hat jemand anders gespeichert, und man muss neu laden oder zusammenführen. - Web: Der Nutzer liest ein Formular und speichert Minuten später. Lange Sperren sind unpraktikabel, daher ist optimistisch üblich (ETag und
If-Matchbei HTTP). - Wahl: Selten Konflikte → optimistisch, häufige Konflikte auf denselben Daten (Lagerbestand, Kontostand) → pessimistisch oder atomare Updates (
SET bestand = bestand - 1). - Zusammenhang: Siehe MVCC und Isolationsstufen.
Siehe auch: Transaktionen und ACID