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?

30
demandé sur Nate Sauber 2009-02-09 14:54:36

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.

37
répondu Matthew Farwell 2009-02-09 12:04:56

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!

8
répondu Timbo 2009-02-09 12:56:29

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

2
répondu John Sansom 2009-02-09 12:09:17

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.

1
répondu Jayaprabha 2011-10-09 12:42:34

Cet article est utile pour comprendre les transactions dans SQL Server

Il offre un certain nombre de bons exemples et de définitions simples.

SQL-Server-Transactions et de gestion d'Erreur

1
répondu JGilmartin 2013-07-27 10:11:58