应重试的SQL Server错误列表?

时间:2009-12-30 16:05:29

标签: sql-server ado.net data-access-layer

是否有自动重试有意义的SQL Server存储过程错误的简明列表?显然,重试“登录失败”错误没有意义,但重试“超时”确实如此。我想可能更容易指定要重试的错误,而不是指定哪些错误不重试。

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

谢谢!

5 个答案:

答案 0 :(得分:3)

您应该重试(重新运行)整个事务,而不仅仅是单个查询/ 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。

答案 1 :(得分:2)

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

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
    };

答案 2 :(得分: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 :(得分:0)

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

答案 4 :(得分:0)

您应该始终在插入和更新上捕获的一个sql server错误(并且经常会错过),是死锁错误号。 1205

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