Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment attraper SqlException causé par un blocage?

Le code d'erreur spécifique à Microsft SQL Server pour un blocage est 1205, vous devez donc gérer l'exception SqlException et vérifier cela. Ainsi, par ex. si pour tous les autres types de SqlException vous voulez que l'exception apparaisse :

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

Ou, en utilisant le filtrage des exceptions disponible en C# 6

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

Une chose pratique à faire pour trouver le code d'erreur SQL réel pour un message donné est de regarder dans sys.messages dans SQL Server.

ex.

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

Une autre façon de gérer les interblocages (à partir de SQL Server 2005 et versions ultérieures) consiste à le faire dans une procédure stockée à l'aide du support 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

Il y a un exemple complet ici dans MSDN sur la façon d'implémenter la logique de nouvelle tentative d'interblocage uniquement dans SQL.