0Pricing
SQL Academy · Lektion

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 UPDATE

Vor- 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, retry

Optimistisch 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 message

Advisory 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 seconds

Zusammenfassung

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

  1. ACID-Eigenschaften und Anomalien
  2. Isolationsstufen: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. Deadlocks: Erkennung und Vermeidung
  4. Optimistisches vs. pessimistisches Sperren
← Zurück zu SQL Academy