IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Pourquoi la transaction ne fait pas de rollback ? [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut Pourquoi la transaction ne fait pas de rollback ?
    Hello,

    Toujours avec mes promos (qui font que je vous pose quelques questions ces derniers temps^^), j'ai créé une procédure stockée qui crée une copie d'une promo.

    Je vous passe tout le corps de la procédure car elle fait plus de 200 lignes mais voici ce qui importe pour la question que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    CREATE PROCEDURE [S_PROMO].[UP_COPY_PROMO]
            @tous les paramètres qui vont bien
    AS
    BEGIN
        SET NOCOUNT ON;
     
        BEGIN TRAN
     
        --Tout le corps de la procédure
     
        IF @@ERROR <> 0
        BEGIN
            DECLARE @MSG AS VARCHAR(1000) = 'ERROR DURING COPYING THE PROMO';
            RAISERROR(@MSG,16,1)
            ROLLBACK TRAN
        END
        ELSE
            COMMIT TRAN
    END
    GO
    On vient de faire un test et à un moment, une contrainte de type check n'a pas été respectée. Je m'attendais donc à ce qu'un rollback de toute la transaction soit effectuée. Seulement cela n'a pas été le cas. Des lignes ont été insérées dans certaines tables et n'ont pas été supprimées. J'en déduis donc que le rollback ne s'est pas effectué et je ne comprends pas pourquoi.

    Dans le corps de la procédure, il n'y a que des select, insert, update. Aucun appel à d'autres procédures stockées.
    Kropernic

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Arf... Déception !!! Je viens d'avoir une idée et après vérification, c'est bien ça...

    @@ERROR donne celon la MSDN : Retourne le numéro d'erreur pour la dernière instruction Transact-SQL exécutée.

    Du coup, je dois tester @@ERROR après chaque instruction !!
    Kropernic

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Du coup, je dois tester @@ERROR après chaque instruction !!
    En effet.

    Vous pouvez aussi plus simplement déclarer une variable @error et faire après chaque instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @error += @@error
    vous pouvez aussi regarder du coté de XACT_ABORT qui annulera l'ensemble de la transaction à la première erreur rencontrée quelle que soit sa sévérité.

    Comment gérez vous les éventuelles erreurs dans le corps de votre procédure ?

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Euh... Je n'ai pas vraiment de gestion d'erreur.

    Je teste juste s'il y a eu une erreur et si oui, je fais un rollback. Si non, je commit.

    J'ai utilisé votre conseil au sujet de la variable @ERROR. Je trouve cela plus propre. A part ça... Je ne fais rien d'autre :-/
    Kropernic

  5. #5
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Tu peux faire la gestion d'erreur avec des TRY CATCH aussi.
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Hello,

    Je reviens sur le sujet pour une dernière question juste histoire d'être sûr.

    Si je mets juste avant d'ouvrir une trasaction SET XACT_ABORT ON;, je n'ai plus besoin de tester la variable @@error vu que la transaction subit de toute façon rollback à la première erreur rencontrée peu importe sa sévérité.

    C'est correct ou je suis passé à côté de quelque chose en lisant la doc??
    Kropernic

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Oui, ça semble adéquat surtout que :

    Euh... Je n'ai pas vraiment de gestion d'erreur.
    Je teste juste s'il y a eu une erreur et si oui, je fais un rollback. Si non, je commit.

    ça présentera même certains avantages, puisque si par exemple votre transaction rencontre une erreur au début, non bloquante (division par 0 par exemple), alors avec XACT_ABORT OFF (par défaut) elle continuera d’exécuter des choses qui seront finalement rollbackées, alors qu'avec XACT_ABORT ON, elle s’arrêtera immédiatement.
    Un autre avantage : XACT_ABORT terminera une transaction en cas de timeout coté client, alors que dans les autres cas, elle pourra rester ouverte et ainsi maintenir des verrous...

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    XACT_ABORT vient de devenir mon instruction préférée ^^.
    Kropernic

  9. #9
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    IL s'agit une bonne sage décision.

    Je vous invite à lire un billet, très détaillé sur ce sujet, que j'ai publié sur le Blogs forum du présent site DVP.

    SQL Server - Gestion des exceptions TRY .. CATCH Rendre une application plus robuste

    où j'explique comment combiner les constructions TRY CATCH et XACT_ABORT ON pour rendre les applications plus robustes.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Spring @transactional ne fait pas de rollback
    Par gatlin dans le forum Spring
    Réponses: 1
    Dernier message: 23/10/2012, 15h29
  2. [PDO] rollback ne se fait pas sur la totalité de la transaction
    Par Alexdezark dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/08/2010, 14h26
  3. [Data] rollback sur transaction ne semble pas fonctionner
    Par willoi dans le forum Spring
    Réponses: 3
    Dernier message: 22/04/2008, 13h39
  4. Réponses: 26
    Dernier message: 05/02/2007, 17h57
  5. Réponses: 11
    Dernier message: 13/07/2006, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo