我有一个类'Database',它作为ADO.net的包装器。例如,当我需要执行一个过程时,我调用Database.ExecuteProcedure(procedureName, parametersAndItsValues)。
我们在SQL Server 2000中遇到了严重的死锁问题。 我们的团队正在努力优化sql代码和事务以尽量减少这些问题,但我想让这个Database类对死锁情况更加强健。
我们希望死锁受害者可以在一段时间延迟后重试,但我不知道是否可能实现。这是我们使用的一个方法的代码:
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 块里吗?
retryCount--
之后,考虑在重试循环中添加一个短暂的延迟,例如Thread.Sleep(100);
,以避免对SQL Server造成过大的负荷。 - Doug Knudsen