web-dev-qa-db-fra.com

Lorsqu'il est nécessaire de vérifier @@ trancount> dans try catch block?

Parfois, j'ai vu l'extrait de code suivant. Quand le if @@trancount > 0 est-il nécessaire avec begin try? Les deux? Ou est-ce un moyen sûr (meilleure pratique) de toujours le vérifier au cas où il serait annulé avant le contrôle?

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
18
ca9163d9

Je peux penser à quelques scénarios à considérer lors de l'utilisation de @@trancount

  1. La transaction en cours a été appelée à partir d’une autre procédure stockée ayant Sa propre transaction.
  2. La transaction en cours a été appelée par un code .NET avec sa propre transaction
  3. La transaction en cours est la seule transaction

Je crois que Traitement des exceptions et transactions imbriquées de Remus Rusanu gère toutes ces possibilités.

8
8kb

la raison de cette vérification est que si vous validez ou annulez-le lorsque @@ trancount = 0, vous obtenez une exception avec le message d'erreur suivant:.

0
khaled tarboosh

lorsque vous n'utilisez pas @@ trancount, le message d'erreur de la procédure stockée de transaction imbriquée ne renvoie pas la cause exacte de l'erreur. facile à gérer l'erreur avec la syntaxe appropriée.

0
Khati Lx