No SQL Server, há um thread separado que periodicamente (padrão 5 segundos, intervalo mais baixo se um conflito acabou de ser detectado) verifica uma lista de esperas por quaisquer ciclos. Ou seja, ele identifica o recurso que um encadeamento está aguardando, depois encontra o proprietário desse recurso e localiza recursivamente qual recurso esse encadeamento está esperando, identificando os encadeamentos que aguardam os recursos uns dos outros.
Se um impasse for encontrado, a vítima será escolhida para ser morta usando este algoritmo:
- Identifique threads que não são passíveis de inabilidade (por exemplo, uma thread que está revertendo uma transação é inaceitável).
- Encontre o encadeamento com a menor prioridade de conflito.
- Escolha o que é mais barato para reverter, ou seja, aquele que fez menos trabalho até agora.
Você pode encontrar mais informações sobre a detecção de conflito de servidores SQL aqui:
http://msdn.microsoft.com/en-us/library/ms178104.aspx
O proprietário da transação / desenvolvedor do aplicativo é responsável por minimizar os riscos de ocorrência de conflitos e que eles deveriam:
- Certifique-se de manter as transações o mais curtas possível. Por exemplo, não mostre um formulário de login após iniciar uma transação e aguarde a entrada do usuário; em vez disso, reúna todas as informações necessárias e execute a transação.
- Use o nível de isolamento mais baixo possível, por exemplo, não defina serializável quando quiser mostrar temporariamente alguns valores para o usuário. Observe que definir o nível correto de isolamento é uma ciência em si e fora do escopo nesta resposta.
- Se você é vítima de um impasse, ou seja, recebe o erro nº 1205, execute novamente a transação de forma transparente para o usuário. Como a outra transação concorrente agora adquiriu os recursos esperados e concluídos, é improvável que você encontre o mesmo impasse novamente.