El código de error específico de Microsft SQL Server para un interbloqueo es 1205, por lo que deberá controlar la SqlException y comprobarlo. Entonces, p. si para todos los demás tipos de SqlException desea que aparezca la excepción:
catch (SqlException ex)
{
if (ex.Number == 1205)
{
// Deadlock
}
else
throw;
}
O bien, utilizando el filtrado de excepciones disponible en C# 6
catch (SqlException ex) when (ex.Number == 1205)
{
// Deadlock
}
Una cosa útil para encontrar el código de error de SQL real para un mensaje determinado es buscar en sys.messages en SQL Server.
por ejemplo
SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033
Una forma alternativa de manejar interbloqueos (desde SQL Server 2005 y superior) es hacerlo dentro de un procedimiento almacenado utilizando el soporte 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
Hay un ejemplo completo aquí en MSDN sobre cómo implementar la lógica de reintento de punto muerto puramente dentro de SQL.