死锁的特定于 Microsoft 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 错误代码,一个方便的方法是查看 SQL Server 中的 sys.messages。
例如
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 中实现死锁重试逻辑。