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?