Я хочу написать некоторый код оболочки для вызовов моей базы данных (используя C# и технологию Microsoft для доступа к базе данных), авто-повтор в случае исключения «переходного». Переходным я имею в виду то, что есть хороший шанс, который в конечном итоге разрешится (в отличие от логических ошибок, которые никогда не будут работать). Примеры, которые я могу думать о том, включают:Sql Server Transition Exception Numbers
- Тупик
- Время ожидания соединения
- Команда таймаут
я планировал использовать номера ошибок SqlException, чтобы обнаружить их. Так, например:
List<RunStoredProcedureResultType> resultSet = null;
int limit = 3;
for (int i = 0; i < limit; ++i)
{
bool isLast = i == limit - 1;
try
{
using (var db = /* ... */)
{
resultSet = db.RunStoredProcedure(param1, param2).ToList();
}
//if it gets here it was successful
break;
}
catch (SqlException ex)
{
if (isLast)
{
//3 transient errors in a row. So just kill it
throw;
}
switch (ex.Number)
{
case 1205: //deadlock
case -2: //timeout (command timeout?)
case 11: //timeout (connection timeout?)
// do nothing - continue the loop
break;
default:
//a non-transient error. Just throw the exception on
throw;
}
}
Thread.Sleep(TimeSpan.FromSeconds(1)); //some kind of delay - might not use Sleep
}
return resultSet;
(. Простите за любые ошибки - я только что написал, что на лету, я также понимаю, что я мог бы обернуть его красиво ...)
Таким образом, ключевым вопросом является : какие числа следует считать «переходными» (я понимаю, что я считаю переходным, может отличаться от того, что другие считают временной). Я нашел хороший список здесь:
https://msdn.microsoft.com/en-us/library/cc645603.aspx
, но его массивная и отметить очень полезно. Кто-нибудь еще создал список, который они используют для чего-то подобного?
UPDATE
В конце концов, мы остановили свой выбор на «плохой» список - если ошибка является одним из списка известных «без переходных ошибок», - которые, как правило, программист ошибки. Я включил список номеров, которые мы используем в качестве ответа.
мы сделали что-то подобное. назвал его «восстанавливаемыми исключениями». включая ошибки подключения, тайм-ауты и взаимоблокировки. но: взаимоблокировки, вероятно, будут сохраняться, когда вы просто повторите вызов трижды - подумайте о добавлении переменной задержки или других методов разрешения взаимоблокировок. и таймаут соединения из-за перегрузки может также ухудшиться, если вы сразу же запустите два повторных попытки. – dlatikay
О да, я планировал задержку. Спасибо @dlatikay - обновит выше – thab
Привет, вы просите рекомендации, к сожалению, это не разрешимый вопрос, потому что у любого программиста может быть другое мнение о том, что было бы полезно для вашего дела, поэтому так, как оно в настоящее время отредактировано это не в тему; С уважением. – jclozano