gpt4 book ai didi

.net - 如何捕获死锁引起的SqlException?

转载 作者:行者123 更新时间:2023-12-03 05:02:53 25 4
gpt4 key购买 nike

在 .NET 3.5/C# 应用程序中,我想捕获 SqlException,但仅当它是由 SQL Server 2008 实例上的死锁引起时

典型的错误消息是事务(进程 ID 58)在锁资源上与另一个进程发生死锁,并已被选为死锁牺牲品。重新运行事务。

但是,它似乎没有记录在案 error code对于这个异常(exception)。

针对消息中存在的死锁关键字过滤异常似乎是实现此行为的一种非常丑陋的方式。有人知道这样做的正确方法吗?

最佳答案

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

有一个完整的示例 here MSDN 中介绍了如何纯粹在 SQL 中实现死锁重试逻辑。

关于.net - 如何捕获死锁引起的SqlException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2256939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com