Den Microsft SQL Server-specifika felkoden för ett dödläge är 1205 så du måste hantera SqlException och kontrollera det. Så, t.ex. om du för alla andra typer av SqlException vill ha bubblan uppåt:
catch (SqlException ex)
{
if (ex.Number == 1205)
{
// Deadlock
}
else
throw;
}
Eller genom att använda undantagsfiltrering som är tillgänglig i C# 6
catch (SqlException ex) when (ex.Number == 1205)
{
// Deadlock
}
En praktisk sak att göra för att hitta den faktiska SQL-felkoden för ett givet meddelande är att leta i sys.messages i SQL Server.
t.ex.
SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033
Ett alternativt sätt att hantera dödlägen (från SQL Server 2005 och högre), är att göra det inom en lagrad procedur med hjälp av TRY...CATCH-stödet:
BEGIN TRY
-- some sql statements
END TRY
BEGIN CATCH
IF (ERROR_NUMBER() = 1205)
-- is a deadlock
ELSE
-- is not a deadlock
END CATCH
Det finns ett fullständigt exempel här i MSDN om hur man implementerar logik för återförsök med dödläge rent inom SQL.