Список ошибок 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, и простое повторное выполнение запросов только еще более сузит проблему. Например, с ошибкой тайм-аута у вас обычно будет узкое место в сети, плохо проиндексированные таблицы или что-то в этих строках, и повторный запуск того же запроса увеличит задержку других запросов, которые, очевидно, изо всех сил пытаются выполнить.

Другие вопросы по тегам