Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como capturar SqlException causado por deadlock?


O código de erro específico do Microsft SQL Server para um deadlock é 1205, portanto, você precisa lidar com o SqlException e verificar isso. Assim, por exemplo se para todos os outros tipos de SqlException você deseja que a bolha a exceção seja:
catch (SqlException ex)
{
    if (ex.Number == 1205)
    {
        // Deadlock 
    }
    else
        throw;
}

Ou, usando a filtragem de exceção disponível em C# 6
catch (SqlException ex) when (ex.Number == 1205)
{
    // Deadlock 
}

Uma coisa útil a fazer para encontrar o código de erro SQL real para uma determinada mensagem é procurar em sys.messages no SQL Server.

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

Uma maneira alternativa de lidar com deadlocks (do SQL Server 2005 e superior) é fazê-lo em um procedimento armazenado usando o suporte 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

Há um exemplo completo aqui no MSDN de como implementar a lógica de repetição de deadlock puramente dentro do SQL.