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

Puzzle deadlock:la vittima non possiede alcuna risorsa, utilizzata per uccidere per risolvere il deadlock

Nel contesto del blocco, le tabelle e i relativi indici sono entità separate. A volte, il deadlock si verifica tra una tabella e il suo indice, piuttosto che tra due tabelle separate.

Il problema è molto probabile quando viene acquisito un blocco su un indice e quindi viene acquisito un altro blocco sulla tabella correlata (es. barra) per eseguire la ricerca dei dati. Durante l'inserimento, ciò avverrà nell'ordine opposto. Innanzitutto, la tabella (cioè la barra) viene bloccata e aggiornata, quindi gli indici vengono bloccati.

select foo 
from bar 
where @someId = 0 OR SomeId = @someId

Hai/puoi aggiungere un indice di copertura (per aiutare con la selezione) che contiene sia SomeId che foo ? In questo modo eviterai del tutto la ricerca e impedirai il verificarsi del problema.

Puoi pubblicare i piani di query anziché i frame deadlock?