应该重试的 SQL Server 错误列表?

Posted

技术标签:

【中文标题】应该重试的 SQL Server 错误列表?【英文标题】:List of SQL Server errors that should be retried? 【发布时间】:2010-12-31 03:46:27 【问题描述】:

是否存在对自动重试有意义的 SQL Server 存储过程错误的简明列表?显然,重试“登录失败”错误没有意义,但重试“超时”却可以。我认为指定重试哪些错误可能比指定不重试哪些错误更容易。

那么,除了“超时”错误,还有哪些其他错误适合自动重试?

谢谢!

【问题讨论】:

【参考方案1】:

您应该重试(重新运行)整个事务,而不仅仅是单个查询/SP。 至于重试的错误,我一直在使用以下列表:

DeadlockVictim = 1205,
SnapshotUpdateConflict = 3960,
// I haven't encountered the following 4 errors in practice
// so I've removed these from my own code:
LockRequestTimeout = 1222,
OutOfMemory = 701,
OutOfLocks = 1204,
TimeoutWaitingForMemoryResource = 8645,

最重要的当然是“死锁受害者”错误1205。

【讨论】:

包括3960(“快照隔离事务因更新冲突而中止。”)如果您使用的是新的(ish)快照隔离级别,因为该错误将显示而不是死锁。您可能还需要包含3621,它是通用的“语句已终止”,通常包含在其他错误中。【参考方案2】:

您可以使用 SQL 查询来查找明确请求重试的错误(尝试排除那些也需要其他操作的错误)。

SELECT  error, description
FROM    master.dbo.sysmessages
WHERE   msglangid = 1033
        AND (description LIKE '%try%later.' OR description LIKE '%. rerun the%')
        AND description NOT LIKE '%resolve%'
        AND description NOT LIKE '%and try%'
        AND description NOT LIKE '%and retry%'

以下是错误代码列表: 539, 617, 952, 956, 983, 1205, 1807, 3055, 5034, 5059, 5061, 5065, 8628, 8645, 8675, 10922, 14258, 20689, 25003, 27118, 30024, 30026, 30085, 33115, 33116, 40602, 40642, 40648

您可以调整查询以查找其他情况,例如超时或内存问题,但我建议您预先正确配置超时长度,然后在这些情况下稍微后退。

【讨论】:

【参考方案3】:

我会扩展该列表,如果您想要绝对完整的列表,请使用查询并过滤结果。

select * from master.dbo.sysmessages where description like '%memory%'


    int[] errorNums = new int[]
    
        701, // Out of Memory
        1204, // Lock Issue
        1205, // Deadlock Victim
        1222, // Lock request time out period exceeded.
        7214, // Remote procedure time out of %d seconds exceeded. Remote procedure '%.*ls' is canceled.
        7604, // Full-text operation failed due to a time out.
        7618, // %d is not a valid value for a full-text connection time out.
        8628, // A time out occurred while waiting to optimize the query. Rerun the query.
        8645, // A time out occurred while waiting for memory resources to execute the query. Rerun the query.
        8651, // Low memory condition
    ;

【讨论】:

【参考方案4】:

您应该始终在插入和更新时发现的一个 sql server 错误(并且经常被忽略)是死锁错误号。第1205章

适当的操作是重试 INSERT/UPDATE 几次。

【讨论】:

【参考方案5】:

我不确定这些错误的完整列表,但我可以警告您在重试查询时要非常小心。当您从 SQL 中得到错误时,通常会出现更大的问题,而简单地重新运行查询只会进一步压缩问题。例如,由于超时错误,您通常会遇到网络瓶颈、索引不良的表或这些行,并且重新运行相同的查询会增加其他已经明显难以执行的查询的延迟。

【讨论】:

以上是关于应该重试的 SQL Server 错误列表?的主要内容,如果未能解决你的问题,请参考以下文章

SQLClient 哪些错误号与 SQL Server 连接错误有关,所以我可以重试

使用单个客户端和单个会话模拟 SQL Server 上的死锁

如何查看sql server 2008的SQL语句执行错误日志

通过 Polly 重试策略确定最终重试的完成

SQL Server 错误:当子查询没有用 EXISTS 引入时,选择列表中只能指定一个表达式

启动 SQL Server 管理 Studio 在 SQL Server 2008R2 中的错误消息:"无法读取此系统上以前注册的服务器的列表" 解决方法