Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Che cos'è SQL Server Deadlock?

Ci sono molte ragioni per cui le applicazioni potrebbero essere lente a rispondere, ma se gli utenti si lamentano delle prestazioni, potresti avere a che fare con un deadlock di SQL Server. Fortunatamente, esistono modi per identificare e correggere il deadlock di SQL Server e persino impedire che influisca negativamente sulle prestazioni delle applicazioni.

Il deadlock di SQL Server è essenzialmente una situazione di stallo tra due processi che competono per l'accesso esclusivo alla stessa risorsa. Poiché solo un processo alla volta può utilizzare una risorsa, le prestazioni rallentano finché il deadlock non viene risolto.

Esistono due tipi di deadlock di SQL Server a cui prestare attenzione:blocchi di conversione e blocchi di ciclo.

I deadlock del blocco di conversione si verificano quando un thread tenta di convertire un blocco da un tipo esclusivo a un altro tipo esclusivo, ma non può perché un thread diverso contiene già un blocco condiviso sulla risorsa che il primo thread sta tentando di convertire.

In SQL Server sono disponibili tre tipi di blocchi di conversione:

  • Condiviso con intento esclusivo (SIX):questo blocco si verifica quando una transazione che contiene un blocco condiviso ha anche un blocco esclusivo su alcune pagine o righe.
  • Condiviso con aggiornamento intenzionale (SIU):questo blocco si verifica quando una transazione che contiene un blocco condiviso ha anche alcune pagine o righe bloccate con un blocco di aggiornamento.
  • Aggiornamento con intento esclusivo (UIX):questo blocco si verifica quando una transazione che contiene un blocco di aggiornamento ha anche un blocco esclusivo su alcune pagine o righe.

I blocchi di ciclo sono deadlock di SQL Server causati da due processi in lizza per un blocco esclusivo su una risorsa bloccata dall'altro processo.

Ad esempio, il Processo 1 sta mantenendo un blocco sulla Risorsa 1 mentre attende che il Processo 2 rilasci il suo blocco sulla Risorsa 2. Se il Processo 2 sta mantenendo un blocco sulla Risorsa 2 mentre aspetta che il Processo 1 rilasci la Risorsa 1, abbiamo noi stessi un blocco del ciclo.

Come diagnosticare il deadlock di SQL Server

Il deadlock di SQL Server è solo una delle decine di possibili motivi per cui l'applicazione potrebbe avere problemi di prestazioni. Se le query che normalmente vengono eseguite rapidamente rallentano improvvisamente, è possibile che tu abbia un deadlock. Ma è anche possibile che stia succedendo qualcos'altro.

Quindi, oltre a notare una velocità di query ridotta, come si determina con certezza se il deadlock è la causa dei problemi di prestazioni del database?

Il modo più semplice e definitivo per identificare il deadlock è la presenza di un messaggio di errore 1205:

La transazione (ID processo %d) è stata bloccata su %.*ls risorse con un altro processo ed è stata scelta come vittima del deadlock. Riesegui la transazione.

Il messaggio di errore 1205 ti dice letteralmente che c'è un deadlock e come risolverlo. Tuttavia, come sottolinea Jeremiah Peschka, se non hai risolto la causa del deadlock, rieseguire la transazione probabilmente non avrà successo.

Un'altra opzione per trovare deadlock consiste nell'estrarre un grafico deadlock di SQL Server da eventi estesi. L'estrazione del deadlock tramite gli eventi estesi consente di esaminare l'XML del deadlock, che fornisce più informazioni rispetto alla rappresentazione grafica di un grafico di deadlock.

L'XML deadlock è organizzato dall'elenco delle vittime, dall'elenco dei processi e dall'elenco delle risorse. Ogni sezione fornisce descrizioni dettagliate delle vittime, dei processi e delle risorse coinvolte nello stallo, il che semplifica la risoluzione dei problemi e il problema.

Come risolvere il deadlock di SQL Server

L'unico modo per risolvere un deadlock di SQL Server è terminare uno dei processi e liberare la risorsa bloccata in modo che il processo possa essere completato. Ciò si verifica automaticamente quando SQL Server rileva un deadlock e termina uno dei processi concorrenti (ovvero la vittima).

SQL Server normalmente sceglie quale connessione terminare in modo casuale, ma è possibile impostare le priorità di deadlock per determinare quale connessione viene interrotta durante un deadlock. Quando due connessioni hanno impostazioni di priorità diverse, SQL Server interromperà la transazione con la priorità più bassa.

Come prevenire il deadlock di SQL Server

Il deadlock di SQL Server è un dato di fatto quando gestisci un database occupato. Tuttavia, i DBA possono aiutare a ridurre il verificarsi di deadlock e ridurre al minimo il loro impatto sulle prestazioni del database adottando alcune misure preventive:

  • Crea indici migliori
  • Regola le priorità delle transazioni
  • Attiva un modello Prova/Riprova
  • Cambia le modalità di isolamento
  • Tieni le serrature il più breve tempo possibile
  • Accedi alle risorse sempre nello stesso ordine
  • Non inviare una transazione finché non hai tutte le informazioni di cui hai bisogno
  • Limita l'escalation del blocco

Sebbene non sia possibile prevenire completamente il deadlock di SQL Server, puoi implementare queste best practice ed eludere in modo proattivo alcune delle fonti più comuni di deadlock per mantenere le transazioni fluide e ottimizzare le prestazioni del database.