Quel est l’avantage d’utiliser « SET XACT_ABORT ON » dans une procédure stockée ?
Réponses
Trop de publicités?SET XACT_ABORT on demande à SQL Server pour restaurer l'intégralité de la transaction et annuler le lot lorsqu'une erreur d'exécution se produit. Elle vous couvre en cas comme une commande timeout survenant sur le client de l'application plutôt que dans SQL Server lui-même (qui n'est pas couverte par la valeur par défaut XACT_ABORT paramètre sur OFF.)
Depuis un délai d'attente de requête va quitter la transaction ouverte, SET XACT_ABORT on est recommandée dans toutes les procédures stockées avec les transactions explicites (sauf si vous avez une bonne raison de faire autrement) que les conséquences d'une application effectuant des travaux sur un lien avec une transaction sont désastreuses.
Il y a une excellente vue d'ensemble sur Dan Guzman Blog,
À mon avis, SET XACT_ABORT on a été rendu obsolète par l'ajout de COMMENCER/COMMENCER à ATTRAPER dans SQL 2k5. Avant de blocs d'exception dans les instructions Transact-SQL, il était vraiment difficile de gérer les erreurs et déséquilibrée, les procédures sont trop communs (procédures qui avaient un autre @@TRANCOUNT à la sortie par rapport à l'entrée).
Avec l'ajout d'instructions Transact-SQL gestion des exceptions est beaucoup plus facile d'écrire des procédures correctes qui sont garantis à équilibrer correctement les transactions. Par exemple, j'ai utiliser ce modèle pour la gestion des exceptions une des transactions imbriquées qui me permet d'écrire atomique des procédures d'annulation de leur propre travail en cas de recouvrable des erreurs.
L'un des principaux problèmes de Transact-SQL procédures visage est la pureté de données: parfois, les paramètres reçus ou les données dans les tableaux sont tout simplement faux, résultant en un double de la clé des erreurs, référentielle de limiter les erreurs, vérification de limiter les erreurs et ainsi de suite et ainsi de suite. Après tout, c'est exactement le rôle de ces contraintes, si ces données pureté des erreurs serait impossible et tous pris par la logique métier, les contraintes seraient toutes obsolètes (dramatique exagération ajoutée pour l'effet). Si XACT_ABORT est SUR, puis toutes ces erreurs de résultat dans l'ensemble de la transaction étant perdu, plutôt que d'être en mesure d'exception de code, des blocs de gérer l'exception gracieusement. Un exemple typique est d'essayer de faire une INSERTION et de revenir à une mise à JOUR sur le PK violation.
Citant MSDN:
Lorsque SET XACT_ABORT est SUR, si une instruction Transact-SQL soulève une erreur d'exécution, la totalité de la transaction est terminée et restaurée. Lorsque SET XACT_ABORT est ÉTEINT, dans certains cas, seule l'instruction Transact-SQL qui a déclenché l'erreur est annulée et l'opération continue le traitement.
Dans la pratique, cela signifie que certaines des déclarations qui risquent d'échouer, laissant l'opération "partiellement achevées", et il pourrait y avoir aucun signe de cet échec pour l'appelant.
Un exemple simple:
INSERT INTO t1 VALUES (1/0)
INSERT INTO t2 VALUES (1/1)
SELECT 'Everything is fine'
Ce code s'exécuter avec succès avec XACT_ABORT OFF, et se termine avec une erreur avec XACT_ABORT on ('INSERT INTO t2 ne sera pas exécuté, et d'une application client génère une exception).
Une approche plus souple, vous pouvez cocher la case @@ERROR après chaque instruction (vieille école), ou d'utiliser les blocs TRY...CATCH (MSSQL2005+). Personnellement, je préfère set XACT_ABORT on quand il n'y a aucune raison pour que certaines avancées de gestion d'erreur.
En ce qui concerne les délais d'attente et l'utilisation de XACT_ABORT à les manipuler, à mon avis, il y a au moins une très bonne raison d'avoir des délais d'attente de client Api comme SqlClient, et qui est de protéger le client de l'application du code de blocages survenus dans le code SQL server. Dans ce cas, le code client n'a pas de faute, mais a pour le protéger de l'auto de blocage foreveor d'attente pour la commande d'complètes sur le serveur. Donc, à l'inverse, si le client délais d'attente doivent exister pour protéger le code client, le fait de XACT_ABORT on a à protéger le serveur de code à partir d'un client abandonne, dans le cas où le code du serveur prend plus de temps pour exécuter que le client est disposé à attendre.