Transactions imbriquées dans Sql Server
Imaginez le scénario suivant:
J'utilise SQL Server 2005. J'ai une transaction qui appelle, entre autres, SQL, une procédure stockée qui dispose également d'une transaction à l'intérieur. La transaction externe échoue parfois et elle est annulée après que la procédure stockée est appelée et validée avec succès.
Ma question Est, est-ce que la restauration de la transaction de la procédure stockée aussi?
5 réponses
Avec une transaction imbriquée, une validation n'écrit aucune modification sur le disque, sauf pour la transaction de niveau supérieur. Une restauration, cependant, fonctionne quel que soit le niveau de la transaction, donc oui, il va rouler la transaction interne en arrière.
Absolument oui, la transaction de niveau supérieur possédera toutes les modifications de données jusqu'à ce qu'elle soit validée ou annulée.
Cependant, je vous encourage à réfléchir soigneusement au modèle de transaction. Plus de tels scénarios existent dans votre système, plus votre exposition aux problèmes de verrouillage est grande. En outre, la dépense de calcul de la procédure augmente.
Il est remarquable à quelle fréquence, 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 encouragez-vous (et 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
Santé, John
J'ai essayé avec begin tran et commit dans la procédure stockée say usp_test.
Exec 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 begin tran rollbacked même le commit SP tran.
Donc, commencez d'abord Tran posséder les changements de données.
Cet article est utile pour comprendre les transactions dans SQL Server
Il offre un certain nombre de bons exemples et de définitions simples.