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.