sql try/catch restauration/validation - la prévention de la erronée s'engager après la restauration
Je suis en train d'écrire un MS sql script a une transaction et un bloc try/catch. Si il attrape une exception, la transaction est annulée. Sinon, la transaction est validée. J'ai vu quelques sites différents disant de faire comme ceci:
begin transaction
begin try
--main content of script here
end try
begin catch
rollback transaction
end catch
commit transaction
Mais n'avons-nous pas encore touché le "commit transaction" ligne, même dans le cas de l'interception d'une exception? Ne sera pas, c'est une erreur SQL, car la transaction a déjà été annulée? Je pense qu'il devrait être fait comme ceci:
declare @success bit = 1
begin transaction
begin try
--main content of script here
end try
begin catch
rollback transaction
set @success = 0
end catch
if(@success = 1)
begin
commit transaction
end
Howcome couramment-posté solution ne comprend pas le @réussite variable? Il n'y a pas d'erreur sql qui arrive comme un résultat de commettre une transaction qui a déjà été annulée? Je suis incorrect de dire que la "transaction commit" ligne du premier exemple de code va encore frapper dans le cas de l'interception d'une exception?
- Je n'aurais pas fait faire de ces deux groupes. Je voudrais déplacer le commettre à l'intérieur du bloc TRY. Il n'est pas nécessaire pour les autres variables, comme vous l'avez posté. C'est un des gros avantages de TRY/CATCH est que nous pouvons sortir de l'pâtes de variables et de les vérifier tous sur la place.
- Je suis d'accord avec Sean méthode, mais la meilleure façon de savoir si il va provoquer une erreur SQL lors de commit de la transaction est de l'essayer. Si c'est le plus accepté de méthode il n'a probablement pas.
Vous devez vous connecter pour publier un commentaire.
J'ai toujours pensé que ce fut l'un des meilleurs articles sur le sujet. Il inclut dans l'exemple suivant que je pense qu'il est clair et comprend souvent négligé @@trancount qui est nécessaire pour la fiabilité des transactions imbriquées
; THROW
avantEND CATCH
à augmenter l'erreur, sinon l'erreur se mange et vous ne savez pas ce qui s'est passé.IF(@@TRANCOUNT > 0)
si toutes les transactions imbriquées (même si, 0) sont annulées si une erreur se produit dans le TRY clause?Dans votre premier exemple, vous avez raison. Le lot sera frappé de la validation de la transaction, indépendamment de si le bloc try incendies.
Dans votre deuxième exemple, je suis d'accord avec les autres commentateurs. À l'aide de l'indicateur de réussite est inutile.
Je considère l'approche suivante pour être, essentiellement, d'un poids léger approche des meilleures pratiques.
Si vous voulez voir comment il gère une exception, modifiez la valeur de la seconde plaquette de 255 à 256.
J'ai utilisé ci-dessous ms sql script de modèle à plusieurs reprises avec succès qui utilise Try-Catch,Commit Transaction - Rollback Transaction,Erreur de Suivi.
Votre bloc TRY sera comme suit
Votre bloc CATCH sera comme suit
Un ROLLBACK script va être une partie de bloc CATCH comme suit
Au-dessus de différents blocs de script, vous devez utiliser comme un bloc. Si une erreur se produit dans le ESSAYER bloc il va aller à l' ATTRAPER bloc. Là, il est le réglage de diverses informations sur le numéro d'erreur gravité erreur,erreur ligne ..etc. Enfin tous ces éléments seront à ajouter à @paramètre ErrMsg. Ensuite, il va vérifier pour le compte de la transaction (@@TRANCOUNT >0) , c'est à dire si quelque chose est là, dans la transaction pour la restauration. Si elle est là, puis afficher le message d'erreur et ROLLBACK TRANSACTION. Sinon, il suffit d'imprimer le message d'erreur.
Nous avons gardé notre COMMIT TRANSACTION T script vers la dernière ligne du bloc de l'essai afin de s'assurer qu'il devrait valider la transaction(dernier changement dans la base de données), qu'une fois tout le code dans le bloc TRY est exécuté avec succès.
Opération contre
Ci-dessous peut être utile.
Source: https://msdn.microsoft.com/en-us/library/ms175976.aspx