web-dev-qa-db-fra.com

Exécution d'une procédure stockée dans BEGIN / END TRANSACTION

Si je crée une procédure stockée en SQL et l'appelle (EXEC spStoredProcedure) dans la COMMENCE/FIN DE LA TRANSACTION, cette autre procédure stockée entre-t-elle également dans la transaction?

Je ne savais pas si cela fonctionnait comme try/catches en C #.

37
Miles

Oui, tout que vous faites entre la transaction Begin et la validation (ou la restauration) fait partie de la transaction.

40
Blorgbeard

Sonne bien, merci beaucoup. J'ai fini par faire quelque chose comme ça (parce que je suis sur 05)

    BEGIN TRY
       BEGIN TRANSACTION

       DO SOMETHING

       COMMIT
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
         ROLLBACK

      -- Raise an error with the details of the exception
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
             @ErrSeverity = ERROR_SEVERITY()

      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH
12
Miles

Comme Chris l'a mentionné, vous devez faire attention à annuler la transaction.

Plus précisément ceci:

IF @@TRANCOUNT > 0 ROLLBACK

n'est pas toujours ce que vous voulez. Vous pourriez faire quelque chose comme ça

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

De cette façon, le proc appelant peut inspecter la valeur de retour de la procédure stockée et déterminer s'il souhaite tout de même valider ou continuer à faire remonter l'erreur.

La raison en est que "COMMIT" ne fera que décrémenter votre compteur de transactions. Une fois qu'il décrémente le compteur de transactions à zéro, une validation réelle se produit.

5
James

Je crois que dans MS SQL Server, l'exécution des procédures stockées se produirait dans la transaction, mais soyez très prudent avec cela. Si vous avez des transactions imbriquées (c'est-à-dire une transaction en dehors de la procédure stockée et une transaction différente à l'intérieur de la procédure stockée), une restauration affectera TOUTES les transactions, pas seulement la transaction englobante la plus proche.

5
Chris Shaffer

Comme Chris et James mentionné, vous devez être prudent lorsque vous traitez des transactions imbriquées. Il y a un ensemble de très bons articles sur le sujet des transactions écrits par Don Peterson sur SQL Server Centra l, je recommanderais de les lire:

Ici, il y a:

2
kristof

@Chris, je ne le savais pas.

Lors de la recherche sur Google pour plus d'informations, je suis tombé sur this - vous pouvez définir des "points de sauvegarde", qui peuvent être restaurés sans annuler la totalité de la transaction.

Pourrait être utile dans cette situation.

1
Blorgbeard

Oui, tous les appels de procédure stockée imbriqués sont inclus dans la portée de la transaction. Si vous utilisez SQL Server 2005 ou une version ultérieure, vous pouvez également utiliser Try ... Catch. Ici est plus de détails à ce sujet.

1
Ben Hoffstein