OVH Cloud OVH Cloud

procedure et transaction

5 réponses
Avatar
Christophe
Bonjour,

est-ce qu'une procedure est direment en transaction ?

exemple quand je suis dans une procedure et que je fais un
begin tran TOTO
@@TRANCOUNT indique deja 2
quand je rollback TOTO il m'envoi un mess d'erreursi je rollback tout court
il annule tout y compris celle de la procedure stockée dans laquelle je suis
?le but c'est d'annuler que la transaction nommée TOTO ??

5 réponses

Avatar
Christian Robert
Bonjour,

Une procédure stockée ne fait pas implicitement partie d'une transaction.

Il faut soit explicitement faire un BEGIN TRANSACTION ou avoir l'option SET
IMPLICIT_TRANSACTIONS à ON (auquel cas la première instruction de
manipulation des données la démarre).
Si vous faites un ROLLBACK il annule l'ensemble des transactions en cours et
pas seulement celle dont vous précisez le nom.

Dans votre exemple, vous avez du executer 2 fois le code ou avoir
l'instruction SET évoqué plus haut et vous avez sans doute oublié le
ROLLBACK, ce qui a pour effet de pas décrémenter @@TRANCOUNT. Verifiez le
paramètre IMPLICIT_TRANSACTIONS, faite un SET à OFF si vous n'êtes pas sûr et
verfifiez que @@TRANCOUNT est à 0 avant le EXEC, si ce n'est pas le cas
executez ROLLBACK jusqu'à que ce compteur soit à 0.

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


"Christophe" a écrit :

Bonjour,

est-ce qu'une procedure est direment en transaction ?

exemple quand je suis dans une procedure et que je fais un
begin tran TOTO
@@TRANCOUNT indique deja 2
quand je rollback TOTO il m'envoi un mess d'erreursi je rollback tout court
il annule tout y compris celle de la procedure stockée dans laquelle je suis
?le but c'est d'annuler que la transaction nommée TOTO ??





Avatar
Rudi Bruchez
>> ?le but c'est d'annuler que la transaction nommée TOTO ??





Bonjour,

Ajout pour complétude : le ROLLBACK d'une partie d'une transaction est
possible en utilisant le principe des points de sauvegarde.
Voir "Transaction Savepoints" ou "SAVE TRANSACTION" dans les BOL (l'aide en
ligne)

A noter que le ROLLBACK d'un point de sauvegarde ne décrémente pas
@@TRANCOUNT

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
Solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/
Avatar
Christophe
si il ne decremente pas @@trancount
ca risque de me faire un message d'erreur sur le global alors ?

Sinon comment faire pour pouvoir rollbacker une partie precise ?

Merci !




"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news:1te2tpyw21s50.nt53ebixxfd9$

>> ?le but c'est d'annuler que la transaction nommée TOTO ??

Bonjour,

Ajout pour complétude : le ROLLBACK d'une partie d'une transaction est
possible en utilisant le principe des points de sauvegarde.
Voir "Transaction Savepoints" ou "SAVE TRANSACTION" dans les BOL (l'aide


en
ligne)

A noter que le ROLLBACK d'un point de sauvegarde ne décrémente pas
@@TRANCOUNT

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
Solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/


Avatar
Rudi Bruchez
Christophe a écrit:

si il ne decremente pas @@trancount
ca risque de me faire un message d'erreur sur le global alors ?

Sinon comment faire pour pouvoir rollbacker une partie precise ?



Le point d'enregistrement (c'est la bonne traduction française...) est la
seule méthode.

Extrait de l'aide SQL :

L'attribution d'un nom à plusieurs transactions d'une série de transactions
imbriquées a peu d'effet sur la transaction. En effet, seul le premier nom
de transaction (le plus à l'extérieur) est inscrit avec le système. Une
annulation vers tout autre nom (autre que celui d'un point de sécurité
valide) génère une erreur. Dans ce cas, aucune des instructions exécutées
avant l'annulation n'est en fait annulée au moment où l'erreur se produit.
Les instructions ne sont annulées que lorsque l'instruction extérieure est
elle-même annulée.

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
Solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/
Avatar
Christophe
je te remercie avec le point d'enregistrement ca à marché !

"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news:lphn09y71bby$
Christophe a écrit:

> si il ne decremente pas @@trancount
> ca risque de me faire un message d'erreur sur le global alors ?
>
> Sinon comment faire pour pouvoir rollbacker une partie precise ?

Le point d'enregistrement (c'est la bonne traduction française...) est la
seule méthode.

Extrait de l'aide SQL :

L'attribution d'un nom à plusieurs transactions d'une série de


transactions
imbriquées a peu d'effet sur la transaction. En effet, seul le premier nom
de transaction (le plus à l'extérieur) est inscrit avec le système. Une
annulation vers tout autre nom (autre que celui d'un point de sécurité
valide) génère une erreur. Dans ce cas, aucune des instructions exécutées
avant l'annulation n'est en fait annulée au moment où l'erreur se produit.
Les instructions ne sont annulées que lorsque l'instruction extérieure est
elle-même annulée.

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
Solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/