Как я могу обработать потерянное клиентское соединение в блоке try-catch SQL Server T-SQL? - PullRequest
0 голосов
/ 28 апреля 2009

Шаблон блока TSQL BEGIN TRY и BEGIN CATCH не распознает ошибки из-за разрыва соединения с клиентом. Как я могу поймать и обработать потерянное клиентское соединение?

Я устанавливаю флаг, который указывает на обработку при обработке цикла отдельных транзакций, и блок catch сбрасывает этот флаг при ошибке, но если клиентское соединение потеряно, мой блок catch не выполняется ...

PSUEDOCODE:

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

Ответы [ 2 ]

3 голосов
/ 28 апреля 2009

Потеря соединения с базой данных выходит за рамки возможностей TRY / CATCH в T-SQL.

У вас есть несколько вариантов, но это зависит от того, что приемлемо (с точки зрения дизайна) в ваших обстоятельствах. Не будучи осведомленным об этой информации, трудно делать предложения.

Сказав это, одной идеей будет заключить все в "родительскую" транзакцию. Если эта транзакция откатывается (что происходит в соответствии с дизайном, если вы теряете связь), то никакие изменения в этой сессии не сохраняются в базе данных.

0 голосов
/ 28 апреля 2009

Correct.

Потерянное соединение с клиентом фактически является прерыванием и откатом к SQL Server: вы просто прекращаете выполнение SQL, чтобы блок CATCH не выполнялся.

Почему вы группируете отдельные транзакции в цикле? Это может помочь кому-то предложить решение. Часто один вызов SQL - это одна единица работы.

...