Ein Deadlock (Verklemmung) entsteht, wenn zwei oder mehr Transaktionen gegenseitig auf Ressourcen warten, die der jeweils andere hält. Keine der Beteiligten kann weiterarbeiten, ohne dass eine von ihnen abgebrochen wird. In Datenbanken geht es meist um Zeilen- oder Tabellensperren, die eine Transaktion setzt und erst am Ende (COMMIT oder ROLLBACK) wieder freigibt.
Das klassische Beispiel
-- Transaktion A -- Transaktion B
START TRANSACTION; START TRANSACTION;
UPDATE konto SET saldo=... UPDATE konto SET saldo=...
WHERE id=1; WHERE id=2;
UPDATE konto SET saldo=... UPDATE konto SET saldo=...
WHERE id=2; -- blockiert! WHERE id=1; -- blockiert!
COMMIT; COMMIT;
Transaktion A hält die Sperre auf Zeile 1 und will Zeile 2 — die hält B. B will aber Zeile 1, die A hält. Beide warten endlos: Deadlock.
Wie Datenbanken reagieren
InnoDB (MySQL/MariaDB) erkennt Deadlocks automatisch (Deadlock Detection): Der sog. Wait-for-Graph wird überwacht, und die Datenbank bricht eine der beteiligten Transaktionen ab (Rollback). Die Anwendung erhält dann einen Fehler wie ERROR 1213: Deadlock found when trying to get lock (SQLSTATE 40001) und sollte die Transaktion erneut ausführen. Die andere Transaktion läuft normal weiter.
Deadlocks vermeiden
- Konsistente Sperr-Reihenfolge: Alle Transaktionen sperren Zeilen in derselben Reihenfolge (z. B. nach ID sortiert). Dann kann sich kein Zyklus bilden.
- Kurze Transaktionen: Weniger Schritte und schnelles COMMIT verkürzen die Zeit, in der Sperren gehalten werden.
- Passende Indizes: Ohne Index kann die DB ganze Tabellen sperren statt einzelner Zeilen — das erhöht die Kollisionswahrscheinlichkeit massiv.
- Locking-Reads sparsam einsetzen:
SELECT ... FOR UPDATEnur dort verwenden, wo es wirklich nötig ist. - In der Anwendung Retry einplanen: Ein sauberer Client fängt Fehler 1213 ab und startet die Transaktion neu.
Abgrenzung
Beim Livelock (Lebendblockade) geht die Ausführung weiter, kommt aber nie voran (z. B. weil eine Transaktion ständig zurückgesetzt wird); bei Starvation wartet ein Prozess dauerhaft, weil andere immer bevorzugt werden. Echte Deadlocks sind in InnoDB selten und fast immer ein Zeichen für lange Transaktionen oder inkonsistente Sperr-Reihenfolge. Zusammenhänge: ACID erklärt, warum Isolation Sperren überhaupt nötig macht; Stored Procedures helfen, Abläufe kompakt und einheitlich zu halten.