死锁的特定于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错误代码的一件方便的事情是在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
有一个完整的例子这里在如何纯粹的内SQL执行死锁重试逻辑MSDN。
select * from master.dbo.sysmessages where error=1205