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

Outils PostgreSQL Discussion :

[PgAdmin 3] Gestion des transactions


Sujet :

Outils PostgreSQL

  1. #1
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut [PgAdmin 3] Gestion des transactions
    Bonjour,

    Je rencontre un petit soucis avec la gestion des transactions dans PgAdmin III.
    La version que j'utilise est la dernière (1.10), sur un serveur Postgresql 8.3.7.

    Voici le problème : quand je crée une transaction dans un script SQL sous PgAdmin, et que, par hasard , il y a une erreur dans une des lignes du script, PgAdmin procède à un ROLLBACK complet de la transaction depuis le début.

    L'ajout de points de sauvegarde n'y change strictement rien...

    Prenons un exemple simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    begin;
    create temp table toto (id int);
    insert into toto values (1);
    select * from tot; -- là je fais une erreur
    Si je retente un :
    J'ai l'erreur suivante :
    ERROR: relation "toto" does not exist


    ********** Erreur **********

    ERROR: relation "toto" does not exist
    État SQL :42P01
    Si j'ajoute un point de sauvegarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin;
    create temp table toto (id int);
    insert into toto values (1);
    SAVEPOINT mon_pointdesauvegarde;
    select * from tot;
    select * from toto;
    rollback to mon_pointdesauvegarde;
    Le rollback au point de sauvegarde renvoie l'erreur :
    ERROR: ROLLBACK TO SAVEPOINT can only be used in transaction blocks


    ********** Erreur **********

    ERROR: ROLLBACK TO SAVEPOINT can only be used in transaction blocks
    État SQL :25P01
    Si j'exécute le même script en console psql, la restauration au point de sauvegarde fonctionne parfaitement, et ma table toto est toujours là.

    D'où ma question : comment utiliser les points de sauvegarde dans PgAdmin ? Je me doute qu'il s'agit d'un problème de blocs de transaction, mais comment faire ?

    Ca éviterait d'avoir à relancer des parties de traitements particulièrement longs quand on a une erreur un peu plus bas dans un gros script sous PgAdmin...

    Merci d'avance de votre aide,

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  2. #2
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Je peux me tromper mais ne faut-il pas terminer le bloc par un "COMMIT;" ?

    Ce que j'ai compris de l'erreur, c'est que pg ne comprend pas qu'il s'agit d'un bloc transactionnel...

    Cordialement,

    Arkhena
    A bove ante, ab asino retro, a stulto undique caveto

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Merci de bien vouloir m'aider.
    Malheureusement, le problème ne vient pas d'un manque de COMMIT. Je pourrais très bien ne pas vouloir valider les modifications tant que je ne suis pas arrivé au bout du script.
    Tout se passe comme si, dans PgAdmin, on n'avait qu'un seul bloc transactionnel, et que la moindre erreur entraîne un ROLLBACK de tout ce bloc.

    Sous psql, après l'erreur, si on essaie un SELECT quelconque, il y a un message d'erreur qui demande un ROLLBACK, qu'on peut exécuter jusqu'au point de sauvegarde :
    ERROR: current transaction is aborted, commands ignored until end of transaction block
    La question revient à : comment gérer plusieurs blocs de transaction sous PgAdmin ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Désolée de ne pas avoir pu aider... J'avais pensé ça car l'exemple de la doc postgre donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BEGIN;
        INSERT INTO table1 VALUES (1);
        SAVEPOINT mon_pointsauvegarde;
        INSERT INTO table1 VALUES (2);
        ROLLBACK TO SAVEPOINT mon_pointsauvegarde;
        INSERT INTO table1 VALUES (3);
    COMMIT;

    Je ne connais pas PgAdmin et ne peux donc pas vous aider...

    Bon courage!

    Arkhena
    A bove ante, ab asino retro, a stulto undique caveto

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Exact, malheureusement, PgAdmin ne permet pas d'implémenter cet exemple correctement (ou alors je n'ai pas trouvé comment faire ).

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Ce que ça semble montrer, c'est que pgadmin fait un ROLLBACK de lui-même quand une erreur lui est remontée par le serveur.

    J'imagine que pgadmin a fait ce choix pour éviter à l'utilisateur de boucler sur l'erreur "ERROR: current transaction is aborted..." pour toute requête ultérieure à celle qui a provoqué l'erreur, contrairement à psql pour lequel c'est à l'utilisateur de faire le rollback.

    Mais ça a l'inconvénient qu'on ne peut pas utiliser les savepoint comme tu le voudrais.
    A moins qu'il n'y ait une option quelque part dans pgadmin qui permette de désactiver ce rollback automatique.

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    C'est exactement ça, mais je n'ai trouvé aucune option jusque là...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    La réponse est : ce n'est pas possible pour le moment. Si une erreur survient, un ROLLBACK est automatiquement exécuté, sans tenir compte des points de sauvegarde. On n'a pas le choix.
    C'est codé comme ça dans PgAdmin.
    Un ticket a été ouvert pour permettre à l'utilisateur, en cas d'erreur, d'effectuer un rollback complet ou vers un point de sauvegarde, si il en a créé un.

    Par ailleurs, les points de sauvegarde fonctionnent quand même. C'est juste le fait de déclencher une erreur qui provoque un ROLLBACK...

    Je passe en , bien qu'en réalité, il faille attendre une prochaine version de PgAdmin .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. Gestion des transactions avec les composants DOA
    Par lper dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/12/2008, 16h06
  2. [ORACLE] : Gestion des transactions
    Par dcollart dans le forum Oracle
    Réponses: 5
    Dernier message: 07/07/2006, 08h49
  3. [Data] Gestion des transactions
    Par hlr dans le forum Spring
    Réponses: 2
    Dernier message: 21/02/2006, 09h47
  4. Gestion des transactions - Gestion des erreurs
    Par devdev dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 23/03/2005, 20h17
  5. gestion des transactions
    Par viny dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/03/2004, 21h53

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