Список ошибок SQL Server, которые следует повторить?
Существует ли краткий список ошибок хранимых процедур SQL Server, которые имеют смысл автоматически повторять? Очевидно, что повторение ошибки "сбой входа в систему" не имеет смысла, но повторная попытка "тайм-аута" имеет смысл. Я думаю, что было бы проще указать, какие ошибки повторить, чем указать, какие ошибки не повторять.
Итак, кроме ошибок "тайм-аут", какие другие ошибки будут хорошими кандидатами для автоматической повторной попытки?
Спасибо!
5 ответов
Вы должны повторить (перезапустить) всю транзакцию, а не только один запрос /SP. Что касается ошибок, чтобы повторить, я использовал следующий список:
DeadlockVictim = 1205,
SnapshotUpdateConflict = 3960,
// I haven't encountered the following 4 errors in practice
// so I've removed these from my own code:
LockRequestTimeout = 1222,
OutOfMemory = 701,
OutOfLocks = 1204,
TimeoutWaitingForMemoryResource = 8645,
Самым важным, конечно, является ошибка "жертва тупика" 1205.
Вы можете использовать SQL-запрос для поиска ошибок, явно запрашивающих повторную попытку (пытаясь исключить те, которые также требуют другого действия).
SELECT error, description
FROM master.dbo.sysmessages
WHERE msglangid = 1033
AND (description LIKE '%try%later.' OR description LIKE '%. rerun the%')
AND description NOT LIKE '%resolve%'
AND description NOT LIKE '%and try%'
AND description NOT LIKE '%and retry%'
Вот список кодов ошибок: 539, 617, 952, 956, 983, 1205, 1807, 3055, 5034, 5059, 5061, 5065, 8628, 8645, 8675, 10922, 14258, 20689, 25003, 27118, 30024, 30026 30085, 33115, 33116, 40602, 40642, 40648
Вы можете настроить запрос для поиска других условий, таких как тайм-ауты или проблемы с памятью, но я бы порекомендовал правильно настроить длительность тайм-аута, а затем слегка отступить в этих сценариях.
Я бы расширил этот список, если вы хотите абсолютно полный список, воспользуйтесь запросом и отфильтруйте результат.
select * from master.dbo.sysmessages where description like '%memory%'
int[] errorNums = new int[]
{
701, // Out of Memory
1204, // Lock Issue
1205, // Deadlock Victim
1222, // Lock request time out period exceeded.
7214, // Remote procedure time out of %d seconds exceeded. Remote procedure '%.*ls' is canceled.
7604, // Full-text operation failed due to a time out.
7618, // %d is not a valid value for a full-text connection time out.
8628, // A time out occurred while waiting to optimize the query. Rerun the query.
8645, // A time out occurred while waiting for memory resources to execute the query. Rerun the query.
8651, // Low memory condition
};
Одна ошибка сервера sql, которую вы всегда должны ловить при вставках и обновлениях (и она довольно часто пропускается), это ошибка взаимоблокировки нет. 1205
Надлежащее действие - повторить попытку ВСТАВИТЬ / ОБНОВИТЬ небольшое количество раз.
Я не уверен насчет полного списка этих ошибок, но могу предупредить вас, что вы ОЧЕНЬ осторожны при повторных запросах. Часто возникает большая проблема, когда вы получаете ошибки из SQL, и простое повторное выполнение запросов только еще более сузит проблему. Например, с ошибкой тайм-аута у вас обычно будет узкое место в сети, плохо проиндексированные таблицы или что-то в этих строках, и повторный запуск того же запроса увеличит задержку других запросов, которые, очевидно, изо всех сил пытаются выполнить.