Postado originalmente em 27/02/2012 no Valence Developer Blog por Craig Dunk.
Gosto de colecionar bugs (como defeitos de software) ou pelo menos histórias sobre rastreamento de bugs. Com bugs, meus favoritos são sempre sutis e difíceis de reproduzir, mas envolvem uma mudança de uma linha (como resultado, tenho muitas histórias de bugs relacionadas a threading).
Esta semana passei várias horas rastreando um defeito interessante. Basicamente, tivemos algumas novas chamadas de API que estavam falhando espontaneamente em nosso ambiente de controle de qualidade. Depois de ativar o registro e procurar, identifiquei algumas exceções que eram lançadas periodicamente e aproximadamente correspondentes aos horários em que as chamadas da web estavam falhando. Eles incluíram o seguinte:
System.Data.SqlClient.SqlException: a transação (ID do processo 123) foi bloqueada em recursos de bloqueio com outro processo e foi escolhida como a vítima do deadlock. Execute novamente a transação. em System.Data.SqlClient.SqlConnection.OnError (exceção SqlException, quebra booleana)
Felizmente, temos um ótimo (e premiado!) desenvolvedor de banco de dados em uma equipe próxima. Ele havia planejado configurar rastreamentos MSSql comigo, mas na verdade foi capaz de identificar a bala de prata por inspeção e, com base nessa mensagem, foi capaz de identificar um procedimento armazenado e me deu uma lição sobre simultaneidade.
Ele escreve:
A simultaneidade é uma espécie de difícil de acertar neste caso.
Acho que queremos
SELECT @id = TableId
FROM Nome da tabela WITH (HOLDLOCK)
Chave WHERE = @myKey
Em vez de
SELECT @id = TableId
FROM Nome da tabela
Chave WHERE = @myKey
Isso é uma ótima história de bug para coletar, pois realmente foi uma mudança de uma linha e levou algum tempo (para mim) para localizar e, além disso, agora tenho um recurso realmente útil na forma de Postagem do Mythbuster de Michael. O que eu gosto no post (além do tema Mythbuster) é que ele é sistemático, abrangente e oferece as ferramentas para reproduzir e "experimentar isso em casa". Portanto, se você chegou a esta página porque também está depurando uma exceção de deadlock, confira a postagem acima.