Список ошибок SQL Server, которые следует повторить?

Существует ли краткий список ошибок хранимых процедур SQL Server, которые имеет смысл автоматически повторять? Очевидно, что повторная попытка ошибки «сбой входа» не имеет смысла, но повторная попытка «тайм-аут» имеет смысл. Я думаю, что может быть проще указать, какие ошибки повторять, чем указывать, какие ошибки не повторять.

Итак, помимо ошибок «тайм-аут», какие другие ошибки были бы хорошими кандидатами для автоматической повторной попытки?

Спасибо!


person Chris    schedule 30.12.2009    source источник


Ответы (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 «жертва тупика».

person Pent Ploompuu    schedule 30.12.2009
comment
Включите 3960 (транзакция изоляции моментального снимка прервана из-за конфликта обновлений.), если вы используете новый (выходной) уровень изоляции моментального снимка, поскольку эта ошибка будет отображаться вместо взаимоблокировки. Вы также можете включить 3621, который является общим. Оператор был завершен и обычно включается с другими ошибками. - person Nick; 26.02.2016

Я бы расширил этот список, если вы хотите получить абсолютно полный список, используйте запрос и отфильтруйте результат.

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
    };
person Tomek    schedule 08.03.2010

Вы можете использовать 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, 235004, 2710103, 2710103 , 30085, 33115, 33116, 40602, 40642, 40648

Вы можете настроить запрос для поиска других условий, таких как тайм-ауты или проблемы с памятью, но я бы рекомендовал правильно настроить продолжительность тайм-аута заранее, а затем немного отступить в этих сценариях.

person Graham    schedule 07.02.2014

Я не уверен в полном списке этих ошибок, но могу предупредить вас, чтобы вы были ОЧЕНЬ осторожны при повторных попытках запросов. Часто возникает более серьезная проблема, когда вы получаете ошибки от SQL, и простое повторное выполнение запросов только еще больше уменьшит проблему. Например, с ошибкой тайм-аута у вас обычно будет узкое место в сети, плохо проиндексированные таблицы или что-то в этих строках, и повторный запуск того же запроса увеличит задержку других запросов, которые уже явно пытаются выполнить.

person Nathan Wheeler    schedule 30.12.2009

Единственная ошибка сервера sql, которую вы всегда должны отлавливать при вставках и обновлениях (и довольно часто ее пропускают), — это ошибка взаимоблокировки №. 1205

Надлежащим действием является повторная попытка INSERT/UPDATE небольшое количество раз.

person Mitch Wheat    schedule 30.12.2009