2009-04-27 5 views
0

Le modèle de bloc TSQL BEGIN TRY et BEGIN CATCH n'attrape pas les erreurs dues à une connexion client perdue. Comment puis-je attraper et gérer une connexion client perdue?Comment puis-je gérer la connexion client perdue dans un bloc try-catch SQL Server T-SQL?

Je mets un drapeau qui indique le traitement lors du traitement d'une boucle de transactions individuelles et le bloc catch redéfinit ce drapeau en cas d'erreur, mais si la connexion client est perdue, mon bloc catch ne s'exécute pas ...

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 

Répondre

0

Correct.

Une connexion perdue par un client est en réalité une annulation et un retour à SQL Server: vous arrêtez simplement d'exécuter SQL afin que le bloc CATCH ne s'exécute pas. Pourquoi traitez-vous des transactions individuelles en boucle? Pourquoi? Cela peut aider quelqu'un à suggérer une solution. Souvent, un appel SQL est une unité de travail.

3

Une perte de connectivité de base de données tombe hors de la portée de ce ESSAYER/CATCH dans T-SQL peut gérer.

Vous avez un certain nombre d'options, mais cela dépend de ce qui est acceptable (du point de vue de la conception) dans votre situation. N'étant pas au courant de cette information, il est difficile de faire des suggestions. Cela dit, une idée serait de tout emballer dans une transaction «parente». Si cette transaction est annulée (ce qui arrive par conception si vous perdez la connectivité), aucun changement dans cette session n'est conservé dans la base de données.

Questions connexes