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.
InformationsquelleAutor user3666839 | 2014-08-05