Der Microsoft SQL Server-spezifische Fehlercode für einen Deadlock ist 1205, also müssten Sie die SqlException behandeln und danach suchen. Also z.B. Wenn Sie für alle anderen Arten von SqlException die Bubble-Ausnahme oben haben möchten:
catch (SqlException ex)
{
if (ex.Number == 1205)
{
// Deadlock
}
else
throw;
}
Oder verwenden Sie die in C# 6 verfügbare Ausnahmefilterung
catch (SqlException ex) when (ex.Number == 1205)
{
// Deadlock
}
Um den tatsächlichen SQL-Fehlercode für eine bestimmte Nachricht zu finden, ist es praktisch, in sys.messages in SQL Server nachzusehen.
zB
SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033
Eine alternative Möglichkeit, Deadlocks (ab SQL Server 2005 und höher) zu handhaben, besteht darin, dies innerhalb einer gespeicherten Prozedur mit der TRY...CATCH-Unterstützung zu tun:
BEGIN TRY
-- some sql statements
END TRY
BEGIN CATCH
IF (ERROR_NUMBER() = 1205)
-- is a deadlock
ELSE
-- is not a deadlock
END CATCH
Ein vollständiges Beispiel finden Sie hier in MSDN, wie Deadlock-Wiederholungslogik rein innerhalb von SQL implementiert wird.