Question

Si je crée une procédure stockée en SQL et que je l'appelle ( EXEC spStoredProcedure ) dans BEGIN / END TRANSACTION, cette autre procédure stockée est-elle également incluse dans la transaction?

Je ne savais pas si cela fonctionnait comme essayer / attraper en C #.

Était-ce utile?

La solution

Oui, tout ce que vous faites entre la transaction de début et la validation (ou l'annulation) fait partie de la transaction.

Autres conseils

Ça a l'air génial, 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

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

Comme Chris l'a mentionné, vous devez faire preuve de prudence lorsque vous annulez la transaction.

Spécifiquement 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 procureur appelant peut inspecter la valeur de retour de la procédure stockée et déterminer s'il souhaite le valider ou s'il continue à effacer l'erreur.

La raison en est que 'COMMIT' ne fera que décrémenter votre compteur de transactions. Une fois que le compteur de transactions a été réduit à zéro, une validation réelle aura lieu.

As Chris et James Comme mentionné, vous devez faire attention lorsque vous traitez des transactions imbriquées. Il existe de très bons articles sur les transactions écrites par Don Peterson sur SQL Server Centra , je vous recommande de lire ceux-ci:

Ici, il y a:

Oui, tous les appels de procédures stockées imbriquées 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. Voici davantage de détails à ce sujet.

@Chris, je ne le savais pas.

En cherchant plus d’informations sur Google, je suis tombé sur ceci - vous pouvez définir des "points de sauvegarde", qui peuvent être restaurés sans annuler la totalité de la transaction.

Peut être utile dans cette situation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top