Существует ли краткий список ошибок хранимой процедуры SQL Server, которые имеют смысл автоматически повторять? Очевидно, повторяя "вход в систему, отказавший", ошибка не имеет смысла, но повторение "тайм-аут" делает. Я думаю, что могло бы быть легче указать который ошибки повторить, чем указать который ошибки не повторить.
Так, помимо ошибок "тайм-аута", что другие ошибки были бы хорошими кандидатами на автоматическое повторение?
Спасибо!
] Следует повторить (повторить) всю транзакцию, а не только один запрос/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 возникает большая проблема, и простое повторное выполнение запросов только еще больше уплотнит проблему. Например, при ошибке с таймаутом, у вас, как правило, будет либо узкое место в сети, либо плохо индексированные таблицы, либо что-то на этих строках, и повторный запуск одного и того же запроса добавит латентности другим запросам, которые, очевидно, уже изо всех сил пытаются выполнить.
.] Единственная sql ошибка сервера, которую вы всегда должны ловить на вставках и обновлениях (и которая довольно часто пропускается), это ошибка deadlock error no. 1205 [
] [] Соответствующее действие заключается в повторной попытке несколько раз повторить INSERT/UPDATE [
].Я бы расширил этот список, если вы хотите получить абсолютно полный список, используйте запрос и отфильтруйте результат.
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
};