2010-10-19 5 views
0

J'ai le problème suivant. Je dois des procédures stockées (messages de débogage double-indended):Procédures imbriquées avec transactions

CREATE PROC innerProc 
AS 
BEGIN 
     SELECT 'innerProc 1',@@TRANCOUNT 
    BEGIN TRAN 
     SELECT 'innerProc 2',@@TRANCOUNT 
    ROLLBACK 
     SELECT 'innerProc 3',@@TRANCOUNT 
END 

GO ----------------------------------------- 

CREATE PROC outerProc 
AS 
BEGIN 
     SELECT 'outerProc 1',@@TRANCOUNT 
    BEGIN TRAN 
     SELECT 'outerProc 2',@@TRANCOUNT 
    EXEC innerProc 
     SELECT 'outerProc 3',@@TRANCOUNT 
    ROLLBACK 
     SELECT 'outerProc 4',@@TRANCOUNT 
END 

GO ----------------------------------------- 

EXEC outerProc 

Qu'est-ce qu'ils font?

  1. outerProc commence transaction (@@ TRANCOUNT = 1)
  2. exécute innerProc (@@ TRANCOUNT au début de la proc = 1)
  3. innerProc commence une autre transaction (@@ TRANCOUNT = 2)
  4. transaction
  5. innerProc de rollbacks (@@ TRANCOUNT = 0)
  6. ET VOICI lE PROBLÈME: @@ TRANCOUNT au début du innerProc est pas égal à @@ TRANCOUNT à la fin. Qu'est-ce que je fais mal? Est-ce la bonne approche?
+0

Avez-vous déjà résolu ce problème avec succès? Avez-vous encore besoin d'aide pour cela? – jcolebrand

+0

Non. Cela n'a pas fonctionné avec les transactions nommées. J'ai lu certaines opinions et je pense que la transaction et les procédures ne sont pas compatibles. –

Répondre

0

Je crois que vous avez besoin d'utiliser des transactions nommées ou bien vous tuer toutes les transactions lorsque vous rollback sur une imbriqué, même si elle est scope juste la sproc intérieure

http://msdn.microsoft.com/en-us/library/ms188929.aspx

plus lecture: http://msdn.microsoft.com/en-us/library/ms181299.aspx

ROLLBACK TRANSACTION sans nom_point_sauvegarde ou transaction_name rouleaux avant le début de la transaction. Lors de l'imbrication de transactions , cette même instruction annule toutes les transactions internes en l'instruction BEGIN TRANSACTION la plus externe. Dans les deux cas, ROLLBACK TRANSACTION décrémente la fonction système @@ TRANCOUNT à 0. ROLLBACK TRANSACTION nom_point_de_sauvegarde decrement @@ TRANCOUNT.

Questions connexes