【问题标题】:How can I handle lost client connection in a SQL Server T-SQL try-catch block?如何处理 SQL Server T-SQL try-catch 块中丢失的客户端连接?
【发布时间】:2009-04-27 21:59:19
【问题描述】:

TSQL BEGIN TRY 和 BEGIN CATCH 块模式不会捕获由于客户端连接丢失而导致的错误。如何捕获和处理丢失的客户端连接?

我正在设置一个标志,指示在处理单个事务的循环时进行处理,并且 catch 块会在出错时重新设置该标志,但如果客户端连接丢失,我的 catch 块不会执行...

伪代码:

BEGIN TRY
  SET FlagToIndicateProcessing = 1
  LOOP START
    BEGIN TRANS
      DO WORK
    COMMIT TRANS
  LOOP END
  SetSomeValues
  SET FlagToIndicateProcessing = 0
END TRY
BEGIN CATCH
  SetSomeValues
  SET FlagToIndicateProcessing = 0
END CATCH

【问题讨论】:

    标签: sql-server error-handling try-catch


    【解决方案1】:

    数据库连接丢失超出了 T-SQL 中的 TRY/CATCH 可以处理的范围。

    您有多种选择,但这取决于您的情况(从设计的角度来看)什么是可以接受的。不知道这些信息,很难提出建议。

    话虽如此,一个想法是将所有内容包装在“父”事务中。如果该事务被回滚(如果您失去连接,这会按设计发生),则该会话中的任何更改都不会持久保存到数据库中。

    【讨论】:

      【解决方案2】:

      正确。

      客户端丢失连接实际上是中止并回滚到 SQL Server:您只需停止执行 SQL,CATCH 块就不会执行。

      为什么要在一个循环中批量处理单个事务?这可能会帮助某人提出解决方案。通常,一个 SQL 调用就是一个工作单元。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多