OVH Cloud OVH Cloud

RollBack probleme

3 réponses
Avatar
Christophe
J'ai une procedure je vous en donne un exemple de test
avec des trsnasctions imbriquée !
je veux pouvoir faire un rollback sur juste un partie precise
et voici le message retour avec erreur d'erreur !

je suppose qu'il doit y avoir un truc de mal ecrit
par ailleurs le commit fonctionne bien !


0
1
2
Serveur : Msg 6401, Niveau 16, État 1, Procédure test, Ligne 27
Impossible d'annuler (ROLLBACK) T1. Ni transaction ni point d'enregistrement
trouvés.
Rollback T1
2
Serveur : Msg 266, Niveau 16, État 2, Procédure test, Ligne 36
Le compte des transactions après EXECUTE indique qu'il manque une
instruction COMMIT ou ROLLBACK TRANSACTION. Compte précédent = 0, compte en
cours = 1.
1



--****Procedure !!!

CREATE PROCEDURE test
as
Declare @ZOZO int
Print @@trancount

BEGIN tran
Print @@trancount
SELECT top 1 @ZOZO = 5 FROM RechercheSociete
Begin tran T1
Print @@trancount
if @ZOZO = 5
begin
Commit tran T1
Print 'commit T1'
Print @@trancount
end

else

begin
rollback tran T1
Print 'Rollback T1'
Print @@trancount
end


commit Tran
Print @@trancount

3 réponses

Avatar
Christian Robert
Dans votre exemple il faut corriger le code pour que cela fonctionne :

--****Procedure !!!

ALTER PROCEDURE test
as
Declare @ZOZO int
Print @@trancount

BEGIN tran X
Print @@trancount
SELECT top 1 @ZOZO = 4 FROM Person.Contact

Begin tran T1
Print @@trancount
if @ZOZO = 5
begin
Commit tran T1
Print 'commit T1'
Print @@trancount
end
else
begin
rollback tran X
Print 'Rollback T1'
Print @@trancount
end
commit Tran

Print @@trancount

Si l'on fait un Rollback, le rollback doit se faire sur la transaction la
plus externe (ici x, c'est à dire la premiere qui a été démarrée). De plus la
valeur (dans votre exemple 5) ne faisait pas de ROLLBACK.

Pour faire un ROLLBACK "partiel", c'est à dire sur la portion situé entre le
SAVE TRAN et ROLLBACK j'écris ceci :



--****Procedure !!!

ALTER PROCEDURE test
as
Declare @ZOZO int
Print @@trancount

BEGIN tran X
Print @@trancount
SELECT top 1 @ZOZO = 4 FROM Person.Contact

Save tran T1
Print @@trancount
if @ZOZO = 5
begin
Commit tran T1
Print 'commit T1'
Print @@trancount
end
else
begin
rollback tran T1
Print 'Rollback T1'
Print @@trancount
end
commit Tran

Print @@trancount

Le SAVE TRAN crée un point de sauvegarde, et quand on effectue le ROLLBACK
on indique que l'on souhaite revenir à l'état de la transaction au point de
sauvegarde.

--
Cordialement,
Christian Robert http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration


"Christophe" a écrit :

J'ai une procedure je vous en donne un exemple de test
avec des trsnasctions imbriquée !
je veux pouvoir faire un rollback sur juste un partie precise
et voici le message retour avec erreur d'erreur !

je suppose qu'il doit y avoir un truc de mal ecrit
par ailleurs le commit fonctionne bien !


0
1
2
Serveur : Msg 6401, Niveau 16, État 1, Procédure test, Ligne 27
Impossible d'annuler (ROLLBACK) T1. Ni transaction ni point d'enregistrement
trouvés.
Rollback T1
2
Serveur : Msg 266, Niveau 16, État 2, Procédure test, Ligne 36
Le compte des transactions après EXECUTE indique qu'il manque une
instruction COMMIT ou ROLLBACK TRANSACTION. Compte précédent = 0, compte en
cours = 1.
1



--****Procedure !!!

CREATE PROCEDURE test
as
Declare @ZOZO int
Print @@trancount

BEGIN tran
Print @@trancount
SELECT top 1 @ZOZO = 5 FROM RechercheSociete
Begin tran T1
Print @@trancount
if @ZOZO = 5
begin
Commit tran T1
Print 'commit T1'
Print @@trancount
end

else

begin
rollback tran T1
Print 'Rollback T1'
Print @@trancount
end


commit Tran
Print @@trancount






Avatar
Christian Robert
Dans la 2ème requête çà n'est pas :

Commit Tran T1

Mais :

Commit Tran

Et il faut supprimer le Commit Tran final pour que cela fonctionne sans
problème.

La faute au copier/coller trop rapide

--
Cordialement,
Christian Robert http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration


"Christian Robert" a écrit :

Dans votre exemple il faut corriger le code pour que cela fonctionne :

--****Procedure !!!

ALTER PROCEDURE test
as
Declare @ZOZO int
Print @@trancount

BEGIN tran X
Print @@trancount
SELECT top 1 @ZOZO = 4 FROM Person.Contact

Begin tran T1
Print @@trancount
if @ZOZO = 5
begin
Commit tran T1
Print 'commit T1'
Print @@trancount
end
else
begin
rollback tran X
Print 'Rollback T1'
Print @@trancount
end
commit Tran

Print @@trancount

Si l'on fait un Rollback, le rollback doit se faire sur la transaction la
plus externe (ici x, c'est à dire la premiere qui a été démarrée). De plus la
valeur (dans votre exemple 5) ne faisait pas de ROLLBACK.

Pour faire un ROLLBACK "partiel", c'est à dire sur la portion situé entre le
SAVE TRAN et ROLLBACK j'écris ceci :



--****Procedure !!!

ALTER PROCEDURE test
as
Declare @ZOZO int
Print @@trancount

BEGIN tran X
Print @@trancount
SELECT top 1 @ZOZO = 4 FROM Person.Contact

Save tran T1
Print @@trancount
if @ZOZO = 5
begin
Commit tran T1
Print 'commit T1'
Print @@trancount
end
else
begin
rollback tran T1
Print 'Rollback T1'
Print @@trancount
end
commit Tran

Print @@trancount

Le SAVE TRAN crée un point de sauvegarde, et quand on effectue le ROLLBACK
on indique que l'on souhaite revenir à l'état de la transaction au point de
sauvegarde.

--
Cordialement,
Christian Robert http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration


"Christophe" a écrit :

> J'ai une procedure je vous en donne un exemple de test
> avec des trsnasctions imbriquée !
> je veux pouvoir faire un rollback sur juste un partie precise
> et voici le message retour avec erreur d'erreur !
>
> je suppose qu'il doit y avoir un truc de mal ecrit
> par ailleurs le commit fonctionne bien !
>
>
> 0
> 1
> 2
> Serveur : Msg 6401, Niveau 16, État 1, Procédure test, Ligne 27
> Impossible d'annuler (ROLLBACK) T1. Ni transaction ni point d'enregistrement
> trouvés.
> Rollback T1
> 2
> Serveur : Msg 266, Niveau 16, État 2, Procédure test, Ligne 36
> Le compte des transactions après EXECUTE indique qu'il manque une
> instruction COMMIT ou ROLLBACK TRANSACTION. Compte précédent = 0, compte en
> cours = 1.
> 1
>
>
>
> --****Procedure !!!
>
> CREATE PROCEDURE test
> as
> Declare @ZOZO int
> Print @@trancount
>
> BEGIN tran
> Print @@trancount
> SELECT top 1 @ZOZO = 5 FROM RechercheSociete
> Begin tran T1
> Print @@trancount
> if @ZOZO = 5
> begin
> Commit tran T1
> Print 'commit T1'
> Print @@trancount
> end
>
> else
>
> begin
> rollback tran T1
> Print 'Rollback T1'
> Print @@trancount
> end
>
>
> commit Tran
> Print @@trancount
>
>
>
>


Avatar
Christophe
Merci ca fonctionne en effet !

"Christian Robert" <christian.robert(sansspam)@winwise.fr> a écrit dans le
message de news:
Dans la 2ème requête çà n'est pas :

Commit Tran T1

Mais :

Commit Tran

Et il faut supprimer le Commit Tran final pour que cela fonctionne sans
problème.

La faute au copier/coller trop rapide

--
Cordialement,
Christian Robert http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration


"Christian Robert" a écrit :

> Dans votre exemple il faut corriger le code pour que cela fonctionne :
>
> --****Procedure !!!
>
> ALTER PROCEDURE test
> as
> Declare @ZOZO int
> Print @@trancount
>
> BEGIN tran X
> Print @@trancount
> SELECT top 1 @ZOZO = 4 FROM Person.Contact
>
> Begin tran T1
> Print @@trancount
> if @ZOZO = 5
> begin
> Commit tran T1
> Print 'commit T1'
> Print @@trancount
> end
> else
> begin
> rollback tran X
> Print 'Rollback T1'
> Print @@trancount
> end
> commit Tran
>
> Print @@trancount
>
> Si l'on fait un Rollback, le rollback doit se faire sur la transaction


la
> plus externe (ici x, c'est à dire la premiere qui a été démarrée). De


plus la
> valeur (dans votre exemple 5) ne faisait pas de ROLLBACK.
>
> Pour faire un ROLLBACK "partiel", c'est à dire sur la portion situé


entre le
> SAVE TRAN et ROLLBACK j'écris ceci :
>
>
>
> --****Procedure !!!
>
> ALTER PROCEDURE test
> as
> Declare @ZOZO int
> Print @@trancount
>
> BEGIN tran X
> Print @@trancount
> SELECT top 1 @ZOZO = 4 FROM Person.Contact
>
> Save tran T1
> Print @@trancount
> if @ZOZO = 5
> begin
> Commit tran T1
> Print 'commit T1'
> Print @@trancount
> end
> else
> begin
> rollback tran T1
> Print 'Rollback T1'
> Print @@trancount
> end
> commit Tran
>
> Print @@trancount
>
> Le SAVE TRAN crée un point de sauvegarde, et quand on effectue le


ROLLBACK
> on indique que l'on souhaite revenir à l'état de la transaction au point


de
> sauvegarde.
>
> --
> Cordialement,
> Christian Robert http://blogs.developpeur.org/christian/
> MCT - Database Development / Database Administration
>
>
> "Christophe" a écrit :
>
> > J'ai une procedure je vous en donne un exemple de test
> > avec des trsnasctions imbriquée !
> > je veux pouvoir faire un rollback sur juste un partie precise
> > et voici le message retour avec erreur d'erreur !
> >
> > je suppose qu'il doit y avoir un truc de mal ecrit
> > par ailleurs le commit fonctionne bien !
> >
> >
> > 0
> > 1
> > 2
> > Serveur : Msg 6401, Niveau 16, État 1, Procédure test, Ligne 27
> > Impossible d'annuler (ROLLBACK) T1. Ni transaction ni point


d'enregistrement
> > trouvés.
> > Rollback T1
> > 2
> > Serveur : Msg 266, Niveau 16, État 2, Procédure test, Ligne 36
> > Le compte des transactions après EXECUTE indique qu'il manque une
> > instruction COMMIT ou ROLLBACK TRANSACTION. Compte précédent = 0,


compte en
> > cours = 1.
> > 1
> >
> >
> >
> > --****Procedure !!!
> >
> > CREATE PROCEDURE test
> > as
> > Declare @ZOZO int
> > Print @@trancount
> >
> > BEGIN tran
> > Print @@trancount
> > SELECT top 1 @ZOZO = 5 FROM RechercheSociete
> > Begin tran T1
> > Print @@trancount
> > if @ZOZO = 5
> > begin
> > Commit tran T1
> > Print 'commit T1'
> > Print @@trancount
> > end
> >
> > else
> >
> > begin
> > rollback tran T1
> > Print 'Rollback T1'
> > Print @@trancount
> > end
> >
> >
> > commit Tran
> > Print @@trancount
> >
> >
> >
> >