Код ошибки Microsft SQL Server для взаимоблокировки - 1205, поэтому вам нужно обработать исключение SqlException и проверить его. Так, например, если для всех других типов SqlException вы хотите, чтобы всплыло исключение:
catch (SqlException ex)
{
if (ex.Number == 1205)
{
// Deadlock
}
else
throw;
}
Или, используя фильтрацию исключений, доступную в C # 6
catch (SqlException ex) when (ex.Number == 1205)
{
// Deadlock
}
Чтобы найти фактический код ошибки SQL для данного сообщения, удобно заглянуть в файл sys.messages в SQL Server.
, например
SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033
Альтернативный способ обработки взаимоблокировок (от SQL Server 2005 и выше) заключается в том, чтобы сделать это в хранимой процедуре с использованием поддержки 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
Вот полный пример здесь в MSDN о том, как реализовать логику повторных попыток взаимоблокировки исключительно в SQL.