У меня есть класс «База данных», который работает как оболочка для ADO.net. Например, когда мне нужно выполнить процедуру, я вызываю Database.ExecuteProcedure(procedureName, parametersAndItsValues).
У нас возникают серьезные проблемы с ситуациями взаимоблокировки в SQL Server 2000. Часть нашей команды работает над кодом sql и транзакциями, чтобы свести к минимуму эти события, но я думаю о том, чтобы сделать этот класс базы данных устойчивым к ситуациям взаимоблокировки.
Мы хотим, чтобы жертва взаимоблокировки повторила попытку, возможно, после некоторой задержки, но я не знаю, возможно ли это. Вот код метода, который мы используем:
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;
}
Могу ли я выполнить эту обработку внутри блока catch?