198 votes

Quel est l’avantage d’utiliser « SET XACT_ABORT ON » dans une procédure stockée ?

Quel est l’avantage d’utiliser « SET XACT_ABORT ON » dans une procédure stockée ?

260voto

Ben Griswold Points 6949

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,

37voto

Remus Rusanu Points 159382

À 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.

24voto

VladV Points 5071

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.

9voto

ionutm Points 1

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.

1voto

Dan Diplo Points 16133

Il est utilisé dans la gestion des transactions pour faire en sorte que toutes les erreurs dans la transaction est restaurée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X