Imaginez le scénario suivant:
J'utilise SQL Server 2005. J'ai une transaction qui appelle, entre autres instructions SQL, une procédure stockée qui contient également une transaction. La transaction externe échoue parfois et elle est annulée après que la procédure stockée a été appelée et validée avec succès.
Ma question est la suivante: la restauration de la procédure stockée est-elle également annulée?
Avec une transaction imbriquée, une validation n'écrit aucune modification sur le disque, à l'exception de la transaction de niveau supérieur. Un rollback fonctionne cependant quel que soit le niveau de la transaction, donc oui, il annulera la transaction interne.
Absolument oui, la transaction de niveau supérieur détiendra toutes les modifications de données jusqu'à ce qu'elle soit validée ou annulée.
Cependant, je vous encourage à bien réfléchir au modèle de transaction. Plus ces scénarios existent dans votre système, plus vous êtes exposé aux problèmes de verrouillage. Les dépenses de calcul de la procédure augmentent également.
Il est remarquable de voir combien de fois, lors de la rationalisation de SQL, je trouve que les transactions ont été implémentées là où elles ne sont tout simplement pas nécessaires. Je vous encourage (ainsi que toute personne travaillant avec des transactions) à réfléchir soigneusement à la raison pour laquelle vous les utilisez dans chaque contexte et à ce qui se passerait si la transaction n'était pas mise en œuvre. Juste ma valeur 2c!
Oui, la procédure stockée sera annulée.
Voici le flux global de votre code:
BEGIN TRY
BEGIN TRANSACTION
EXEC SotredProcedureName
--Do some other activity
COMMIT TRANSACTION
END TRY
BEGIN CATCH
--IF an error occurs then rollback the current transaction, which includes the stored procedure code.
ROLLBACK TRANSACTION
END CATCH
À la vôtre, John
J'ai essayé avec begin tran et commit dans la procédure stockée, disons usp_test.
Exécutez ces sp avec une autre requête comme ci-dessous
update x set name='xxx'
select * from x---contains 'xxx'
begin tran
update x set name='yyy'
select * from x---contains 'yyy'
exec usp_test
select * from x---contains 'zzz' inside the sp
rollback tran
Lors de l'exécution du nom de la requête ci-dessus dans la table x doit être "xxx" ce n'est pas "zzz" depuis le premier début tran annulé même la validation sp tran.
Donc, commencez par vérifier les modifications des données.
Ceci est un article utile pour comprendre les transactions dans SQL Server
il offre un certain nombre de bons exemples et de définitions simples.