Punti chiave
- Un evento di deadlock si verifica quando due o più transazioni si bloccano a vicenda perché trattengono le stesse risorse bloccate e ne attendono il rilascio.
- I deadlock sono generalmente causati da transazioni concorrenti che competono per le stesse risorse bloccate, ma eventi ripetuti richiedono un’analisi più approfondita.
- Puoi rilevare i deadlock con Extended Events, trace flag, DMV e strumenti di monitoraggio. Configura avvisi e registrazione per intercettare gli incidenti e intervenire rapidamente.
- Rispondi ai deadlock analizzando i grafici di deadlock, individuando gli schemi ricorrenti e coordinando gli interventi correttivi.
- Previeni il ripetersi del problema con l’indicizzazione, l’ottimizzazione delle query e schemi di accesso coerenti.
Uno dei problemi che possono derivare dalla concorrenza e dal blocco nei database relazionali sono i deadlock di SQL Server. Un deadlock si verifica quando due o più transazioni si bloccano a vicenda a tempo indeterminato, perché ciascuna transazione attende una risorsa trattenuta da un’altra. In genere SQL Server annulla una delle transazioni per risolvere il problema. Tuttavia, se i deadlock si ripetono, può essere necessario esaminare più a fondo la progettazione del sistema.
In questo articolo vedremo che cosa sono i deadlock e come si collegano alla concorrenza. La lettura ti aiuterà anche a capire quali strategie pratiche puoi applicare per rilevare i deadlock, rispondere a questi eventi e prevenirli in futuro.
Che cos’è un evento di deadlock
Un deadlock è una situazione in cui le transazioni creano una dipendenza circolare su risorse bloccate. SQL Server è in grado di risolvere automaticamente un evento di deadlock scegliendo una vittima del deadlock. Il processo consiste nell’eseguire il rollback di una transazione per liberare le risorse, così che la transazione autorizzata possa utilizzarle e portare a termine l’operazione.
Ecco un esempio di evento di deadlock:
- La transazione A trattiene il Blocco 1 e richiede il Blocco 2
- La transazione B trattiene il Blocco 2 e richiede il Blocco 1
- Nessuna delle due transazioni può essere completata
Ecco in che cosa consiste la risoluzione da parte di SQL Server:
- Rilevamento del deadlock tramite un monitor dei blocchi interno
- Selezione della vittima del deadlock (la transazione A o la B nell’esempio)
- Rollback della transazione scelta come vittima del deadlock
- Rilascio della risorsa da parte della vittima del deadlock, così che l’altra transazione possa utilizzarla
Anche se può sembrare un meccanismo efficiente, può causare i seguenti inconvenienti:
- Transazioni non riuscite
- Errori applicativi
- Esperienza dell’utente scadente
Il ruolo della concorrenza e dei blocchi nei deadlock
La concorrenza indica i processi che avvengono contemporaneamente in un database. I deadlock sono strettamente legati al modo in cui SQL gestisce questa situazione tramite i blocchi. Per mantenere la coerenza dei dati, SQL Server utilizza:
- Blocchi condivisi (S) per le letture
- Blocchi esclusivi (X) per le scritture
- Blocchi intent per il controllo gerarchico
I deadlock sono più probabili quando:
- Più transazioni accedono agli stessi dati
- I blocchi vengono mantenuti per periodi prolungati
- Si verificano schemi di accesso incoerenti
Ci sono poi diversi altri fattori che possono aumentare il rischio di deadlock:
- Livelli di isolamento: più alto è l’isolamento, maggiore è il numero di blocchi necessari
- Granularità dei blocchi: blocchi a livello di riga, di pagina o di tabella
- Escalation dei blocchi: molti blocchi di riga portano a un’escalation verso i blocchi di tabella
- Ordine di accesso: sequenze di query diverse aumentano i conflitti
Come rilevare i deadlock in SQL Server
Poiché i deadlock avvengono dietro le quinte, servono strumenti e metodi utili per rilevarli.
- Extended Events: uno strumento integrato in SQL Server che acquisisce automaticamente i grafici di deadlock. È leggero ed è disponibile tramite la sessione system health.
- Trace flag: un meccanismo diagnostico utilizzato per scrivere nei log le informazioni sui deadlock (ad esempio 1204 e 1222). È utile per diagnosi rapide.
- Dynamic Management View (DMV): una vista di sistema che puoi interrogare per esaminare il comportamento del database e individuare schemi ricorrenti nel tempo.
- SQL Server Management Studio (SSMS): un’interfaccia utente per interagire con SQL Server che mostra i grafici di deadlock in forma visiva.
- Strumenti di profilazione e monitoraggio: aiutano ad acquisire gli eventi di deadlock in tempo reale e offrono analisi storiche.
I grafici di deadlock sono particolarmente preziosi perché permettono di vedere quali query erano coinvolte, quali risorse erano bloccate e la sequenza esatta degli eventi.
Come configurare avvisi e registrazione per i deadlock
Rilevare i deadlock non basta. Serve sempre un sistema solido che garantisca visibilità e consenta una risposta tempestiva in caso di eventi di deadlock. La consapevolezza operativa migliora grazie a best practice come le seguenti:
- Acquisisci gli eventi di deadlock: utilizza Extended Events (event_file o ring buffer)
- Centralizza i log: conserva i grafici di deadlock in un database centralizzato, dove potranno essere analizzati in un secondo momento.
- Imposta delle soglie: configura il sistema di avvisi in modo che si attivi quando i deadlock superano il valore di riferimento.
- Integra gli strumenti di monitoraggio: includi sempre i deadlock nelle dashboard e nei report per avere visibilità.
- Automatizza le notifiche: imposta l’invio di avvisi automatici ai team IT o DevOps.
Come rispondere ai deadlock
Quando si verifica un deadlock, devi seguire questi passaggi:
- Esegui le procedure immediate, come l’identificazione della vittima del deadlock, la revisione dei log degli errori e degli avvisi e l’acquisizione del grafico di deadlock.
- Procedi con l’analisi esaminando le query coinvolte, individuando le risorse bloccate, verificando l’ordine di esecuzione delle transazioni e cercando eventuali modifiche recenti allo schema o al codice.
- Studia gli schemi ricorrenti per capire se sono coinvolte sempre le stesse tabelle, se i deadlock si verificano nei momenti di carico massimo o se determinate query sono sempre parte del conflitto.
- Collabora con gli sviluppatori se è coinvolta la logica applicativa e, se pertinente, inizia a rivedere le query generate dall’ORM.
Come prevenire i deadlock
Una volta individuata la causa principale dei deadlock ricorrenti, sarà più facile evitare che si ripresentino. Ecco alcune strategie che puoi seguire:
- Standardizzare gli schemi di accesso perché facciano parte di una risorsa condivisa
- Ottimizzare l’indicizzazione per ridurre le scansioni complete delle tabelle, che possono richiedere molto tempo
- Scegliere livelli di isolamento adeguati per ridurre al minimo l’overhead dei blocchi
- Ridurre la durata delle transazioni con commit rapidi o rollback delle transazioni
- Limitare l’escalation dei blocchi suddividendo il lavoro in batch o partizionandolo
Gestire gli eventi di deadlock in modo efficace
I deadlock sono una conseguenza naturale della concorrenza in SQL Server. Anche se il motore del database è in grado di risolverli immediatamente, il loro ripetersi può richiedere un’analisi più approfondita del sistema prima che provochino instabilità. Capire come interagiscono blocchi e concorrenza e intervenire nel modo giusto sui deadlock ricorrenti aiuta a migliorare le prestazioni del database, a ridurre i conflitti tra transazioni e a mantenere il sistema in equilibrio.
Argomenti correlati:
