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?

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top