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 で処理できる範囲外になります。

いくつかのオプションがありますが、それはあなたの状況で (設計の観点から) 何が許容できるかによって異なります。その情報に精通していないため、提案を行うのは困難です。

そうは言っても、すべてを「親」トランザクションにラップするというのが 1 つのアイデアです。そのトランザクションがロールバックされた場合 (接続が失われた場合に設計上発生します)、そのセッションでの変更はデータベースに永続化されません。

于 2009-04-27T22:14:59.533 に答える
0

正しい。

クライアントが接続を失ったことは、事実上、SQL Serverへの中止とロールバックです。つまり、SQLの実行を停止するだけで、CATCHブロックは実行されません。

なぜ個々のトランザクションをループでバッチ処理するのですか?これは誰かが解決策を提案するのに役立つかもしれません。多くの場合、1回のSQL呼び出しは1つの作業単位です。

于 2009-04-28T04:06:20.343 に答える