Kod błędu specyficzny dla Microsoft SQL Server dla zakleszczenia to 1205, więc musisz obsłużyć SqlException i to sprawdzić. Tak więc m.in. jeśli dla wszystkich innych typów SqlException chcesz, aby wyjątek był wyświetlany w górę:
catch (SqlException ex)
{
if (ex.Number == 1205)
{
// Deadlock
}
else
throw;
}
Lub używając filtrowania wyjątków dostępnego w C# 6
catch (SqlException ex) when (ex.Number == 1205)
{
// Deadlock
}
Przydatną rzeczą do zrobienia, aby znaleźć rzeczywisty kod błędu SQL dla danej wiadomości, jest zajrzenie do sys.messages w SQL Server.
np.
SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033
Alternatywnym sposobem obsługi zakleszczeń (od SQL Server 2005 i nowszych) jest wykonanie tego w ramach procedury składowanej przy użyciu obsługi 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
Pełny przykład znajduje się tu w MSDN o tym, jak zaimplementować logikę ponawiania zakleszczeń wyłącznie w SQL.