come rilevare timeout del server SQL da applicazioni .NET senza l'utilizzo di cattura Exception
-
01-10-2019 - |
Domanda
Nella mia domanda attuale, sto eseguendo un aggiornamento invocando comando T-SQL Update. Il problema è quando lo stesso record è bloccato da altri utenti in quel momento.
Al applicazione .NET, l'applicazione attendere che il timeout di SQL Server, allora sarà buttare il timeout SqlException.
E 'possibile eseguire un controllo prima se un particolare record è bloccato da un altro processo, piuttosto che cattura l'eccezione?
Soluzione
No, non proprio.
Il metodo standard è quello di utilizzare try/catch
e la maniglia Numero SqlException
1205
(deadlock vittima), e riprovare la query:
try
{
// do stuff...
}
catch (SqlException sqlEx)
{
switch (sqlEx.Number)
{
case -2: // Client Timeout
case 701: // Out of Memory
case 1204: // Lock Issue
case 1205: // >>> Deadlock Victim
// handle deadlock
break;
case 1222: // Lock Request Timeout
case 2627: // Primary Key Violation
case 8645: // Timeout waiting for memory resource
case 8651: // Low memory condition
...
}
}
[Nota: istruzioni break non aggiunti per compattezza
nota anche , molti problemi di blocco può essere eliminato fornendo l'appropriato indici di copertura.
Altri suggerimenti
Si potrebbe utilizzare la connessione separata con molto breve timeout per tentare di bloccare il record aggiornando qualche campo, ma questo non è ancora in corso per dare 100% di affidabilità.
se davvero hanno la situazione con più utenti editing stessi record, si dovrebbe esaminare le tecniche di blocco ottimistico.
Inoltre, assicurarsi che non si consente agli utenti di bloccare i record a tutti - Utilizzare la modalità disconnessa per eventuali aggiornamenti. In altre parole, il bloccaggio avviene solo per un breve periodo di aggiornamento (<100 ms)