Ein schwerwiegendes Problem bei sperrbasierten Synchronisationsmethoden ist das Auftreten von Verklemmungen (englisch: deadlocks). Tabelle 13.12 zeigt ein Beispiel.
Schritt | T1 | T2 | Bemerkung |
1. | BOT | ||
2. | lockX(A) | ||
3. | BOT | ||
4. | lockS(B) | ||
5. | read(B) | ||
6. | read(A) | ||
7. | write(A) | ||
8. | lockX(B) | T1 muß warten auf T2 | |
9. | lockS(A) | T2 muß warten auf T1 | |
10. | ... | ... | Deadlock |
Eine präzise, aber auch teurere - Methode zum Erkennen von Verklemmungen basiert auf dem sogenannten Wartegraphen. Seine Knoten entsprechen den Transaktionen. Eine Kante existiert von Ti nach Tj, wenn Ti auf die Freigabe einer Sperre von Tj wartet. Bild 13.4 zeigt ein Beispiel.
Es gilt der Satz: Die Transaktionen befinden sich in einem Deadlock genau dann, wenn der Wartegraph einen Zyklus aufweist.
Eine Verklemmung wird durch das Zurücksetzen einer Transaktion aufgelöst: