0

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
4

2 回答 2

3

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

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

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

于 2009-04-27T22:14:59.533 回答
0

正确的。

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

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

于 2009-04-28T04:06:20.343 回答