Liste des erreurs SQL Server qui doivent être retentées?

Existe-t-il une list concise d'erreurs de procédure stockées SQL Server qui ont un sens à réessayer automatiquement? Évidemment, réessayer une erreur de "connection échouée" n'a pas de sens, mais réessayer "timeout" fait. Je pense qu'il pourrait être plus facile de spécifier quelles erreurs réessayer que de spécifier quelles erreurs ne pas réessayer.

Donc, en plus des erreurs de "timeout", quelles autres erreurs seraient de bons candidats pour une nouvelle tentative automatique?

Merci!

Vous devriez réessayer (relancer) la transaction entière, pas juste une seule requête / SP. En ce qui concerne les erreurs à réessayer, j'ai utilisé la list suivante:

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, 

Le plus important est bien sûr l'erreur "deadlock victim" 1205.

Je voudrais étendre cette list, si vous voulez absolument la list complète utiliser la requête et filterr le résultat.

 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 }; 

Vous pouvez utiliser une requête SQL pour searchr des erreurs demandant explicitement une nouvelle tentative (en essayant d'exclure celles qui nécessitent une autre action).

 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%' 

Voici la list des codes d'erreur: 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

Vous pouvez modifier la requête pour searchr d'autres conditions telles que les timeouts d'attente ou les problèmes de memory, mais je vous recommand de configurer correctement la longueur de votre timeout d'attente, puis de reculer légèrement dans ces scénarios.

Je ne suis pas sûr d'une list complète de ces erreurs, mais je peux vous avertir d'être très prudent au sujet de nouvelles requêtes. Il y a souvent un problème plus important lorsque vous recevez des erreurs de SQL, et la simple réexécution des requêtes ne fera que réduire le problème. Par exemple, avec l'erreur timeout, vous aurez généralement un goulot d'étranglement réseau, des tables mal indexées ou quelque chose sur ces lignes, et la réexécution de la même requête appenda à la latence des autres requêtes qui ont déjà du mal à s'exécuter.

L'erreur de server sql que vous devriez toujours attraper sur les insertions et les mises à jour (et il est assez souvent manqué), est l'erreur de blocage non. 1205

L'action appropriée consiste à réessayer le INSERT / UPDATE un petit nombre de fois.