Escrever código à prova de deadlock é muito difícil. Mesmo quando você acessa as tabelas na mesma ordem, ainda pode obter deadlocks [1]. Eu escrevi um post no meu blog que elabora algumas abordagens que ajudarão você a evitar e resolver situações de impasse.
Se você quiser garantir que duas instruções/transações nunca travarão, você poderá conseguir isso observando quais bloqueios cada instrução consome usando o sp_lock procedimento armazenado do sistema. Para fazer isso, você precisa ser muito rápido ou usar uma transação aberta com uma dica de bloqueio.
Notas:
- Qualquer instrução SELECT que precise de mais de um bloqueio de uma só vez pode travar em uma transação projetada de forma inteligente que captura os bloqueios na ordem inversa.