Tout d'abord, je passerais en revue mon code SQL 2000 et j'expliquerais pourquoi cette impasse se produit. La résolution de ce problème peut masquer un problème plus important (par exemple, un index manquant ou une mauvaise requête).
Deuxièmement, je passerais en revue mon architecture pour confirmer que l'instruction d'interblocage doit vraiment être appelée aussi fréquemment (Est-ce que select count(*) from bob
faut-il être appelé 100 fois par seconde ?).
Cependant, si vous avez vraiment besoin d'une prise en charge des interblocages et que vous n'avez aucune erreur dans votre SQL ou votre architecture, essayez quelque chose comme suit. (Remarque :j'ai dû utiliser cette technique pour un système prenant en charge des milliers de requêtes par seconde et rencontrant très rarement des blocages)
int retryCount = 3;
bool success = false;
while (retryCount > 0 && !success)
{
try
{
// your sql here
success = true;
}
catch (SqlException exception)
{
if (exception.Number != 1205)
{
// a sql exception that is not a deadlock
throw;
}
// Add delay here if you wish.
retryCount--;
if (retryCount == 0) throw;
}
}