Recentemente una delle nostre applicazioni ASP.NET ha visualizzato un errore di deadlock del database e mi è stato chiesto di controllare e correggere l'errore. Sono riuscito a scoprire che la causa del deadlock era una procedura memorizzata che stava aggiornando rigorosamente una tabella all'interno di un cursore.
Questa è la prima volta che vedo questo errore e non sapevo come rintracciarlo e risolverlo in modo efficace. Ho provato tutti i modi possibili che conosco e alla fine ho scoperto che la tabella che viene aggiornata non ha una chiave primaria! per fortuna era una colonna di identità.
In seguito ho scoperto che lo sviluppatore che aveva copiato il database per la distribuzione era incasinato. Ho aggiunto una chiave primaria e il problema è stato risolto.
Mi sono sentito felice e sono tornato al mio progetto e ho fatto qualche ricerca per scoprire il motivo di quel punto morto ...
Apparentemente, era una condizione di attesa circolare che ha causato lo stallo. Apparentemente gli aggiornamenti impiegano più tempo senza una chiave primaria che con la chiave primaria.
So che non è una conclusione ben definita, ecco perché sto postando qui ...
- La chiave primaria mancante è il problema?
- Esistono altre condizioni che causano deadlock diversi da (esclusione reciproca, attesa e attesa, nessuna prelazione e attesa circolare)?
- Come posso prevenire e tenere traccia dei deadlock?