J'ai une classe 'Database' qui fonctionne comme un wrapper pour ADO.net. Par exemple, quand j'ai besoin d'exécuter une procédure, j'appelle Database.ExecuteProcedure (procedureName, parametersAndItsValues). Nous rencontrons de graves problèmes avec les situations de blocage dans SQL Server 2000. Une partie de notre équipe travaille sur le code sql et les transactions pour minimiser ces événements, mais je pense à rendre cette classe de base de données robuste contre les situations de blocage.Comment obtenir une gestion efficace des interblocages Sql Server en C# avec ADO?
Nous voulons que la victime de l'impasse réessaye peut-être après un certain temps, mais je ne sais pas si c'est possible. Voici le code d'une méthode que nous utilisons:
public int ExecuteQuery(string query)
{
int rows = 0;
try
{
Command.Connection = Connection;
Command.CommandType = CommandType.Text;
if(DatabaseType != enumDatabaseType.ORACLE)
Command.CommandText = query;
else
Command.CommandText ="BEGIN " + query + " END;";
if (DatabaseType != enumDatabaseType.SQLCOMPACT)
Command.CommandTimeout = Connection.ConnectionTimeout;
if (Connection.State == ConnectionState.Closed)
Connection.Open();
rows = Command.ExecuteNonQuery();
}
catch (Exception exp)
{
//Could I add here any code to handle it?
throw new Exception(exp.Message);
}
finally
{
if (Command.Transaction == null)
{
Connection.Close();
_connection.Dispose();
_connection = null;
Command.Dispose();
Command = null;
}
}
return rows;
}
Puis-je faire cette manipulation à l'intérieur d'un bloc d'arrêt?
Envisager d'ajouter un court délai dans la boucle de réessai comme 'Thread.Sleep (100);' après 'retryCount -;' pour éviter de frapper SQL Server si fort. –