No meu entendimento, um select não adquire lock e não deve ser a causa do deadlock.
Cada vez que você insere/atualiza/ou exclui uma linha, um bloqueio é adquirido. Para evitar o impasse, você deve certificar-se de que as transações simultâneas não atualizem a linha em uma ordem que possa resultar em um impasse. De um modo geral, para evitar o impasse você deve adquirir o bloqueio sempre na mesma ordem mesmo em transações diferentes (por exemplo, sempre a tabela A primeiro, depois a tabela B).
Mas se dentro de uma transação você inserir em apenas uma tabela, essa condição é atendida, e isso geralmente não deve levar a um impasse. Você está fazendo outra coisa na transação?
No entanto, um impasse pode ocorrer se houver índices ausentes . Quando uma linha é inserida/atualizada/excluída, o banco de dados precisa verificar as restrições relacionais, ou seja, certificar-se de que as relações sejam consistentes. Para isso, o banco de dados precisa verificar as chaves estrangeiras nas tabelas relacionadas. Ele pode resultar na aquisição de outro bloqueio além da linha que foi modificada. Certifique-se de sempre ter o índice nas chaves estrangeiras (e, claro, nas chaves primárias), caso contrário, isso pode resultar em um bloqueio de tabela em vez de um bloqueio de linha . Se ocorrer bloqueio de tabela, a contenção de bloqueio é maior e a probabilidade de conflito aumenta.
Não tenho certeza do que acontece exatamente no seu caso, mas talvez ajude.