Quand il est nécessaire de vérifier @@trancount > 0 dans le bloc try catch?
Parfois j'ai vu l'extrait de code suivant. Quel est le if @@trancount > 0
nécessaire avec begin try
? Deux d'entre eux? Ou c'est un moyen sûr(best practice) pour vérifier toujours en cas de restauration avant de le vérifier?
begin tran
begin try
... just several lines of sql ...
if @@trancount > 0 commit tran
end try
begin catch
if @@trancount > 0 rollback tran
end catch
Vous devez vous connecter pour publier un commentaire.
Je ne peux penser à quelques scénarios à prendre en considération lorsque vous traitez avec
@@trancount
:sa propre transaction
transaction
Je crois que Remus Rusanu de La gestion des exceptions et des transactions imbriquées poignées de toutes ces possibilités.
quand u ne pas utiliser @@trancount, le message d'erreur de transaction imbriquée procédure stockée ne retourne pas la cause exacte de l'erreur juste reurtn "La restauration de demande de transaction n'a pas de correspondant begin transaction",sinon il donne la cause exacte de l'erreur, de sorte que son facile à gérer l'erreur avec la bonne syntaxe.
Pour répondre à la question - le temps de faire un @@trancount est si le code dans le milieu pourrait avoir déjà effectué le commit ou rollback de la transaction que vous avez commencé. Donc, si vous êtes l'appel de procédures stockées, par exemple -, puis effectuez les vérifications à la fin.
D'ailleurs, plutôt que de faire un si @@trancount>0, je voudrais suggérer qu'il est préférable de vérifier la @@trancount au début de votre bloc de code, et ensuite voir si le comte a disparu jusqu'à la fin, dans quel cas le commit ou rollback, selon try/catch.
En particulier si vous êtes dans un déclencheur, parce que l' @@trancount sera toujours de 1 il y, il suffit donc de faire un @@trancount>0 peut provoquer une erreur.
Mais même si votre code est juste dans une procédure stockée, supposé que c'était appelée par une autre procédure que lui-même a une transaction, si votre code d'erreurs et annule, alors que l'extérieur de la procédure stockée aura sa transaction annulée également (voir https://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/).
Donc
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
ROLLBACK TRAN
PRINT @@TRANCOUNT
montre
1
2
0
Donc, fondamentalement, - si le code dans le milieu, un appel à d'autres procédures, vous devez effectuer le SI @@TRANCOUNT vérifier.
la raison de vérifier si vous vous engagez trans ou rollback quand @@trancount=0, vous obtenez une exception avec ce message d'erreur :
La TRANSACTION de validation demande n'a pas de correspondant COMMENCER la TRANSACTION.