2009-12-30 9 views
5

Esiste un elenco conciso di errori di stored procedure di SQL Server che hanno senso riprovare automaticamente? Ovviamente, riprovare un errore di "accesso non riuscito" non ha senso, ma lo fa nuovamente "timeout". Sto pensando che potrebbe essere più facile specificare quali errori riprovare piuttosto che specificare quali errori non riprovare.Elenco degli errori di SQL Server che dovrebbero essere riprovati?

Quindi, oltre agli errori di "timeout", quali altri errori sarebbero buoni candidati per il nuovo tentativo automatico?

Grazie!

risposta

3

Si dovrebbe ritentare (rieseguire) l'intera transazione, non solo una singola query/SP. Per quanto riguarda gli errori per riprovare, ho usato il seguente elenco:

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, 

La più importante è naturalmente la "situazione di stallo vittima" errore 1205.

+1

Includi '3960' (" Transazione di isolamento snapshot interrotta a causa di conflitto di aggiornamento. ") Se si sta utilizzando il nuovo livello di isolamento Snapshot (ish), poiché verrà visualizzato tale errore anziché un deadlock.Si potrebbe anche voler includere '3621' che è il generico" L'istruzione è stata terminata "e di solito è inclusa con altri errori. – Nick

0

Non sono sicuro di un elenco completo di questi errori, ma posso avvisarti di essere MOLTO attento a riprovare le query. Spesso c'è un problema più grande quando si verificano errori da SQL, e semplicemente rieseguire le query comporterà ulteriormente il problema. Ad esempio, con l'errore di timeout, in genere si avrà un collo di bottiglia di rete, tabelle indicizzate male o qualcosa su quelle linee, e la riesecuzione della stessa query si aggiungerà alla latenza di altre query che evidentemente hanno difficoltà ad essere eseguite.

0

L'errore di un server sql che si deve sempre rilevare su inserti e aggiornamenti (ed è abbastanza spesso mancato), è l'errore deadlock n. 1205

L'azione appropriata consiste nel riprovare INSERIRE/AGGIORNAMENTO un numero limitato di volte.

2

vorrei estendere tale elenco, se vuoi la lista completa completa usa la query e filtra il risultato.

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

è possibile utilizzare una query SQL per cercare gli errori che richiedono esplicitamente un nuovo tentativo (cercando di escludere quelli che richiedono un'altra azione troppo).

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

Ecco l'elenco dei codici di errore: 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

È possibile modificare la query per cercare altre condizioni come timeout o problemi di memoria, ma io consiglierei configurare correttamente la lunghezza del timeout in anticipo, quindi eseguire un lieve rallentamento in questi scenari.

Problemi correlati