Optimistisches vs. pessimistisches Sperren
Vergleichen Sie die Muster SELECT ... FOR UPDATE (pessimistisch) und Versionsspalte / WHERE updated_at = ? (optimistisch).
Optimistisches vs. pessimistisches Sperren ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Zwei Strategien für Nebenläufigkeit
- Pessimistisch — die Zeile beim Lesen sperren; niemand sonst kann sie ändern
- Optimistisch — nicht sperren; bei der Aktualisierung prüfen, ob die Zeile unverändert ist
Pessimistisch: SELECT ... FOR UPDATE
Jetzt sperren, später schreiben:
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- other transactions cannot lock or update this row
-- compute new balance...
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;FOR SHARE
Lesesperre — andere können lesen, aber nicht schreiben:
SELECT * FROM orders WHERE id = 1 FOR SHARE;
-- others can SELECT FOR SHARE but cannot UPDATEVor- und Nachteile des pessimistischen Ansatzes
Vorteile: einfach nachzuvollziehen, keine Wiederholung erforderlich.
Nachteile: verringert die Nebenläufigkeit und kann zu Wartezeiten auf Sperren und Deadlocks führen.
Optimistisch: Versionsspalte
Mit Version lesen und mit WHERE version = expected schreiben:
BEGIN;
SELECT id, balance, version FROM accounts WHERE id = 1;
-- compute new balance...
UPDATE accounts
SET balance = ?, version = version + 1
WHERE id = 1 AND version = ?;
-- check rows affected: 0 means someone else updated, retryOptimistisch mit updated_at
Dasselbe Prinzip mit updated_at statt einer expliziten Versionsspalte:
UPDATE accounts
SET balance = ?, updated_at = NOW()
WHERE id = ? AND updated_at = ?;
-- If updated_at has changed in the meantime, 0 rows affected — retry.Vor- und Nachteile des optimistischen Ansatzes
Vorteile: hohe Nebenläufigkeit, kein Warten.
Nachteile: Schreibvorgänge können fehlschlagen und eine Wiederholungslogik erfordern; der Konflikt wird erst bei UPDATE sichtbar.
Wann der pessimistische Ansatz sinnvoll ist
Geeignet für:
- Kurze Transaktionen mit hoher Konkurrenz um stark umkämpfte Zeilen
- Geldtransfers — Sie möchten keine teilweise ausgeführten Vorgänge
- Lang laufende Vorgänge, bei denen Konflikte wahrscheinlich sind
Wann der optimistische Ansatz sinnvoll ist
Geeignet für:
- Leselastige Workloads mit seltenen Konflikten
- Zustandslose APIs, bei denen der Client die Zeile zwischen Anfragen hält
- Bearbeitungen auf Mobilgeräten oder offline mit anschließender Synchronisierung
Hybrid: FOR UPDATE NOWAIT
Versuchen Sie zu sperren; wenn die Zeile gesperrt ist, schlagen Sie sofort fehl und lassen Sie den Benutzer den Vorgang wiederholen:
SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;
-- ERROR if someone else holds it — user sees a friendly retry messageAdvisory Locks
Sperren auf Anwendungsebene, die an keine Zeile gebunden sind:
SELECT pg_try_advisory_xact_lock(hashtext('order:42'));
-- True if you got the lock, false otherwise — useful for cross-row coordination.Vergessen Sie nicht, Sperrziele zu indizieren
FOR UPDATE kann ohne Index für die WHERE-Spalte mehr Zeilen als erwartet sperren (es werden gescannte Zeilen gesperrt, nicht nur passende).
Sperr-Timeouts
Setzen Sie lock_timeout, um endloses Warten zu vermeiden:
SET lock_timeout = '5s';
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- ERROR if lock not acquired in 5 secondsZusammenfassung
Der pessimistische Ansatz sperrt die Zeile; der optimistische prüft beim Schreiben.
- Pessimistisch: FOR UPDATE — einfach, aber mit geringerer Nebenläufigkeit
- Optimistisch: Versionsspalte — mehr Nebenläufigkeit, erfordert Wiederholungen
- Wählen Sie den Ansatz je nach Workload und kombinieren Sie beide bei Bedarf
Kurzer Check
Eine Abbuchung vom Lagerbestand im E-Commerce ist stark umkämpft. Welche Sperrstrategie ist im Allgemeinen sicherer?
Häufig gestellte Fragen
Ist die Lektion „Optimistisches vs. pessimistisches Sperren“ kostenlos?
Ja — der vollständige Text von „Optimistisches vs. pessimistisches Sperren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Optimistisches vs. pessimistisches Sperren“?
Vergleichen Sie die Muster SELECT ... FOR UPDATE (pessimistisch) und Versionsspalte / WHERE updated_at = ? (optimistisch). Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Optimistisches vs. pessimistisches Sperren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- ACID-Eigenschaften und Anomalien
- Isolationsstufen: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- Deadlocks: Erkennung und Vermeidung
- Optimistisches vs. pessimistisches Sperren