Kürzlich hat eine unserer ASP.NET-Anwendungen einen Datenbank-Deadlock-Fehler angezeigt und ich wurde aufgefordert, den Fehler zu überprüfen und zu beheben. Es gelang mir herauszufinden, dass die Ursache für den Deadlock eine gespeicherte Prozedur war, die eine Tabelle innerhalb eines Cursors rigoros aktualisierte.
Dies ist das erste Mal, dass ich diesen Fehler sehe und nicht weiß, wie ich ihn effektiv verfolgen und beheben kann. Ich habe alle mir bekannten Möglichkeiten ausprobiert und festgestellt, dass die zu aktualisierende Tabelle keinen Primärschlüssel hat! Zum Glück war es eine Identitätssäule.
Ich fand später den Entwickler, der die Datenbank für die Bereitstellung skriptete, durcheinander. Ich habe einen Primärschlüssel hinzugefügt und das Problem wurde behoben.
Ich fühlte mich glücklich und kehrte zu meinem Projekt zurück und recherchierte, um den Grund für diesen Stillstand herauszufinden ...
Anscheinend war es eine Wartebedingung, die den Deadlock verursachte. Aktualisierungen dauern ohne Primärschlüssel anscheinend länger als mit Primärschlüssel.
Ich weiß, dass es keine genau definierte Schlussfolgerung ist, deshalb poste ich hier ...
- Ist der fehlende Primärschlüssel das Problem?
- Gibt es andere Bedingungen, die einen Deadlock verursachen als (gegenseitiger Ausschluss, Halten und Warten, keine Vorwegnahme und zirkuläres Warten)?
- Wie verhindere und verfolge ich Deadlocks?