SQL Server故障转移期间的瞬态错误

12

我们有一个客户端应用程序通过 C# dll 访问 SQL Server 数据库(镜像和群集),并通过特定错误号上的重试逻辑来解决问题。

在故障转移期间,.dll 抛出暂态错误的问题,如果在重试逻辑中捕获它们,则可以允许客户端应用程序在故障转移后继续优雅地运行。

这是我们目前在重试逻辑中捕获的错误列表:

0 
-2
-1
2 
53
64
233
596
924
1205
1222
2801
4060
6005
10053
10054
10060
40143
40197
40501
40613

有没有人知道关于数据库在故障转移期间可能抛出的更全面的错误列表,而这些错误在故障转移完成后是可以恢复的呢?

肯定有很多软件需要处理这些问题,但我似乎找不到一个好的列表。

谢谢,Chris。


我假设你正在使用 Microsoft SQL Server。在这种情况下,这些数字的含义可以在此处找到:https://technet.microsoft.com/zh-cn/library/cc645603(v=sql.105).aspx 负数列在 1-1000 部分中。在 C# 中,默认情况下会抛出异常,这些异常往往包含比错误号码更多的信息。 - Nick Otten
嗨,尼克,感谢您的评论。这个.dll是内部编写的,因此这些错误代码背后的错误是众所周知的。我的担忧是我们可能错过了一些错误代码。我希望有人能提供更详尽的瞬态错误代码列表,以便我们进行重试。 - ChrisMurray
1
请参考此处的 MS SQL Server 错误代码示例:https://azure.microsoft.com/zh-cn/documentation/articles/sql-database-develop-error-messages/ - Alex Kudryashev
所有的错误信息都在 sys.messages 中,因此您可以查询其中可能的关键字。 - Martin Smith
我了解Mircrosoft网站上列出的错误清单,但我更感兴趣的是查看用户在其应用程序中捕获和重试的SQLException错误代码列表 - 而不仅仅是在连接抛出每个SQLException时都重试。 - meh-uk
显示剩余2条评论
3个回答

4

由于似乎没有普遍适用的列表,我们选择在所有导致连接断开的错误上进行重试。


1

这并不是我正在寻找的 - 我非常清楚 Microsoft 有一个大的错误代码列表,我想知道人们在他们的应用程序中捕获和重试哪些错误代码。 - meh-uk
嗯,我想这可能会因公司而异,因为大多数公司都会针对他们可能犯的特定错误创建try-catch,至于这些错误列表放在这里可能会涉及版权等问题,甚至可能构成犯罪。无论如何,我认为这不是Stack Overflow的初衷,因为那样更多地是基于个人决策而非解决方案本身。 - Rafael
1
我真正需要的是一个合理的常见错误列表。 - meh-uk

-2
Create PROC uspErrorLog
 ( 
@userId varchar(15)  ,
@ExcType varchar(255)='',
@ExcMessage varchar(255)='',
@ExcSource varchar(255)='',
@ExcStackTrace varchar(255)=''
               ,@pageUrl varchar(150)=''
               ,@methodName varchar(150)=''
               ,@lineNo int
               ,@timeZone varchar(150)
                 )
AS
BEGIN
        BEGIN TRY
        BEGIN TRANSACTION

INSERT INTO [Common].[ErrorLogs]
           ([userId]
           ,[ExceptionType]
           ,[ExceptionMessage]
           ,[ExceptionSource]
           ,[ExceptionStackTrace]
           ,[pageUrl]
           ,[MethodName]
           ,[LineNumber]
           ,[Timezone]
           ,[LogDate])
     VALUES
           ( @userId
           ,@ExcType
           ,@ExcMessage
           ,@ExcSource
           ,@ExcStackTrace
           ,@pageUrl
           ,@methodName
           ,@lineNo
           ,@timeZone
           ,getdate()
           )
        COMMIT TRAN
    END TRY

    BEGIN CATCH
        IF @@TRANCOUNT > 0

        SELECT NULL AS ID
            ,'Cant Perform Insert Action.Error:' +  Error_message()  AS Message
            ,ERROR_LINE() AS linentto

        ROLLBACK TRAN --RollBack in case of Error                                                      

    END CATCH
END



 And call this procedure in your stored procedures in {catch} by passing the variables.Like this

开始捕获

IF @@TRANCOUNT > 0
        SELECT NULL AS ID
            ,'Cant perform operation.Error:' + Error_message() AS Message
            ,ERROR_LINE() AS linoo

    ROLLBACK TRAN --RollBack in case of Error                              

    DECLARE @methodname VARCHAR(200)
        ,@msg VARCHAR(max)
        ,@lineno INT

    SET @methodname = (
            SELECT Error_procedure()
            )
    SET @msg = (
            SELECT Error_message()
            )
    SET @lineno = (
            SELECT Error_line()
            )

    EXEC [dbo].[uspErrorLog] @CreatedBy
        ,''
        ,@msg
        ,''
        ,''
        ,''
        ,@methodname
        ,@lineno
        ,''

结束捕获


2
我们已经设置了记录错误代码的方法。问题在于当我们遇到一个没有重试逻辑的错误时,它会停止客户端应用程序,因此我们只能逐个找到这些瞬态错误。 - ChrisMurray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接