2009-12-30 10 views
5

¿Hay una lista concisa de errores del procedimiento almacenado de SQL Server que tiene sentido para volver a intentar automáticamente? Obviamente, reintentar un error de "inicio de sesión fallido" no tiene sentido, pero reintentar "timeout" sí lo tiene. Estoy pensando que podría ser más fácil especificar qué errores volver a intentar que especificar qué errores no volver a intentar.Lista de errores de SQL Server que se deben volver a intentar?

Por lo tanto, además de los errores de "tiempo de espera", ¿qué otros errores serían buenos candidatos para reintentar automáticamente?

Gracias!

Respuesta

3

Debe volver a intentar (volver a ejecutar) toda la transacción, no solo una consulta/SP. En cuanto a los errores de reintento, He estado usando la siguiente lista:

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, 

El más importante es, por supuesto, el error de "punto muerto víctima" 1205.

+1

Incluya '3960' (" Transacción de aislamiento de instantáneas cancelada debido a un conflicto de actualización. ") Si está utilizando el nuevo nivel de aislamiento de instantánea (ish), ya que ese error aparecerá en lugar de un interbloqueo.Es posible que también desee incluir '3621' que es el genérico" La declaración ha finalizado "y generalmente se incluye con otros errores. – Nick

0

No estoy seguro acerca de una lista completa de estos errores, pero puedo advertirle que tenga MUCHO cuidado en volver a intentar las consultas. A menudo hay un problema más grande en marcha cuando obtienes errores de SQL, y simplemente volviendo a ejecutar consultas solo compactará el problema. Por ejemplo, con el error de tiempo de espera, normalmente tendrá un cuello de botella de red, tablas mal indexadas o algo así, y volver a ejecutar la misma consulta aumentará la latencia de otras consultas que obviamente ya no pueden ejecutar.

0

El error del servidor sql que siempre debe detectar en las inserciones y actualizaciones (y con frecuencia se pasa por alto), es el error de interbloqueo no. 1205

La medida adecuada es volver a intentar la INSERCIÓN/ACTUALIZACIÓN una pequeña cantidad de veces.

2

Me gustaría extender esa lista, si quieres una lista absolutamente completa usa la consulta y filtra el resultado.

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

Se puede utilizar una consulta SQL para buscar errores que solicitan explícitamente un reintento (tratando de excluir a aquellos que requieren otra acción también).

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

Aquí está la lista de códigos de error: 539, 617, 952, 956, 983, 1205, 1807, 3055, 5034, 5059, 5061, 5065, 8628, 8645, 8675, 10922, 14258 , 20689, 25003 , 27 118, 30024, 30026 , 30085, 33115 , 33116, 40602 , 40642, 40648

Puede modificar la consulta para buscar otras condiciones como tiempos de espera o problemas de memoria, pero recomiendo configurar su longitud de tiempo de espera correctamente al principio, y luego retroceder levemente en estos escenarios.

Cuestiones relacionadas