Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come catturare SqlException causato da deadlock?

Il codice di errore specifico di Microsft SQL Server per un deadlock è 1205, quindi è necessario gestire SqlException e verificarlo. Quindi, ad es. se per tutti gli altri tipi di SqlException vuoi che la bolla metta in alto l'eccezione:

catch (SqlException ex)
{
    if (ex.Number == 1205)
    {
        // Deadlock 
    }
    else
        throw;
}

Oppure, usando il filtro delle eccezioni disponibile in C# 6

catch (SqlException ex) when (ex.Number == 1205)
{
    // Deadlock 
}

Una cosa utile da fare per trovare il codice di errore SQL effettivo per un determinato messaggio è cercare in sys.messages in SQL Server.

es.

SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033

Un modo alternativo per gestire i deadlock (da SQL Server 2005 e versioni successive) consiste nell'eseguirlo all'interno di una stored procedure utilizzando il supporto TRY...CATCH:

BEGIN TRY
    -- some sql statements
END TRY
BEGIN CATCH
    IF (ERROR_NUMBER() = 1205)
        -- is a deadlock
    ELSE
        -- is not a deadlock
END CATCH

C'è un esempio completo qui in MSDN di come implementare la logica dei tentativi di deadlock esclusivamente all'interno di SQL.