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

Che cos'è un deadlock in un database?

In generale, deadlock significa che due o più entità stanno bloccando alcune fonti e nessuna di esse è in grado di terminare, perché stanno bloccando le fonti in modo ciclico.

Un esempio:diciamo che ho la tabella A e la tabella B, devo fare qualche aggiornamento in A e poi in B e decido di bloccarle entrambe al momento dell'uso (questo è un comportamento davvero stupido, ma ora serve al suo scopo ). Nello stesso momento, qualcun altro fa la stessa cosa nell'ordine opposto:prima blocca B, poi blocca A.

Cronologicamente, questo accade:

proc1:Blocca A

proc2:Blocca B

proc1:Lock B - inizia ad aspettare fino a quando proc2 rilascia B

proc2:Lock A - inizia ad aspettare fino a quando proc1 rilascia A

Nessuno dei due finirà mai. Questo è un punto morto. In pratica, questo di solito si traduce in errori di timeout poiché non si desidera che nessuna query sia sospesa per sempre e il sistema sottostante (ad esempio il database) ucciderà le query che non finiscono in tempo.

Un esempio reale di deadlock è quando chiudi le chiavi di casa in macchina e le chiavi della macchina in casa tua.