Publié à l’origine le 27/02/2012 sur le blog des développeurs de Valence par Craig Dunk.
J’aime collecter des bugs (comme dans les défauts logiciels) ou au moins des histoires sur le suivi des bogues. Avec les bugs, mes favoris sont toujours subtils et difficiles à reproduire mais impliquent un changement d’une ligne (En conséquence, j’ai beaucoup d’histoires de bugs liées au threading).
Cette semaine, j’ai passé un certain nombre d’heures à traquer un défaut intéressant. Fondamentalement, nous avons eu de nouveaux appels d’API qui échouaient spontanément dans notre environnement d’assurance qualité. Après avoir augmenté la journalisation et cherché à travers, j’ai identifié quelques exceptions qui ont été lancées périodiquement et qui correspondaient à peu près aux moments où les appels web ont échoué. Il s’agissait notamment des éléments suivants :
System.Data.SqlClient.SqlException : la transaction (ID de processus 123) a été bloquée sur les ressources de verrouillage avec un autre processus et a été choisie comme victime de blocage. Réexécutez la transaction. à System.Data.SqlClient.SqlConnection.OnError(Exception SqlException, Pause booléenneConnection)
Heureusement, nous avons un excellent développeur de base de données (et primé !) dans une équipe à proximité. Il avait prévu de mettre en place des traces MSSql avec moi, mais a été en mesure d’identifier la solution miracle par inspection et, sur la base de ce message, a pu identifier une procédure stockée et m’a donné une leçon sur la concurrence.
Il écrit :
La simultanéité est en quelque sorte difficile à maîtriser dans ce cas.
Je pense que nous voulons
SELECT @id = TableId
FROM TableName WITH (HOLDLOCK)
Clé WHERE = @myKey
À la place de
SELECT @id = TableId
FROM TableName
Clé WHERE = @myKey
Cela fait une grande histoire de bug pour la collecte car c’était vraiment un changement d’une ligne et a pris un certain temps (pour moi) pour localiser et en outre, j’ai maintenant une ressource vraiment utile sous la forme de l'article de Michael sur les Mythbusters. Ce que j’aime à propos du post (en plus du thème Mythbuster), c’est qu’il est systématique, complet et vous donne les outils pour reproduire et « essayer cela à la maison ». Donc, si vous êtes arrivé sur cette page parce que vous aussi débogez une exception de blocage, vous voudrez consulter le message ci-dessus.