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.