Per quanto mi risulta, un select non acquisisce il blocco e non dovrebbe essere la causa del deadlock.
Ad ogni inserimento/aggiornamento/eliminazione di una riga viene acquisito un blocco. Per evitare il deadlock, devi quindi assicurarti che le transazioni simultanee non aggiornino la riga in un ordine che potrebbe causare un deadlock. In generale, per evitare deadlock devi acquisire il lock sempre nello stesso ordine anche in transazioni diverse (es. prima sempre la tabella A, poi la tabella B).
Ma se all'interno di una transazione si inserisce in una sola tabella questa condizione è soddisfatta e questo di solito non dovrebbe portare a un deadlock. Stai facendo qualcos'altro nella transazione?
Tuttavia, può verificarsi un deadlock se sono presenti indici mancanti . Quando una riga viene inserita/aggiorna/elimina, il database deve controllare i vincoli relazionali, ovvero assicurarsi che le relazioni siano coerenti. Per fare ciò, il database deve controllare le chiavi esterne nelle relative tabelle. potrebbe comporta l'acquisizione di un blocco diverso dalla riga modificata. Assicurati quindi di avere sempre l'indice sulle chiavi esterne (e ovviamente sulle chiavi primarie), altrimenti potrebbe causare un blocco della tabella invece di un blocco riga . Se si verifica il blocco della tabella, la contesa di blocco è maggiore e la probabilità di deadlock aumenta.
Non sono sicuro di cosa accada esattamente nel tuo caso, ma forse aiuta.