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

PostgreSQL Discussion :

Transaction et Procédures stockées


Sujet :

PostgreSQL

  1. #1
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mars 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 251
    Points : 174
    Points
    174
    Par défaut Transaction et Procédures stockées
    DEsole pour l'ionconvénient mais e sujet est à la base sur PHP:

    http://www.developpez.net/forums/vie...024008#2024008


    Aie aie aie, lors de ma transaction je lance des procedures stockées et lors du rollabck, rien n'est annulé !!!

    Je m'explique.

    Voici mon code
    Code:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    Function prestationDelete($id)
    {
        global $smarty;
        /**
         *  Déclaration du tableau qui contiendra les id d'objets
         *  dont les images sont à supprimer
         */
        $tabObjet = array();
        /**
         *  Lancement de la transaction qui va supprimé
         */
        $db         = &bddConnexionPGSQL();
        $db->autoCommit(false);
        $res        = $db->query("SELECT count(id_objet), nb_objets_max, nb_objets, pre.id_antiquaire ".
                                    "FROM prestations pre ".
                                        "INNER JOIN objet_commun oc ".
                                            "ON oc.id_antiquaire = pre.id_antiquaire ".
                                        "INNER JOIN antiquaire_client ac ".
                                            "ON pre.id_antiquaire = ac.id_antiquaire ".
                                        "INNER JOIN produits pro ".
                                            "ON pro.id_produit = pre.id_produit ".
                                    "WHERE pre.id_prestation = ".$id." ".
                                    "GROUP BY nb_objets_max, nb_objets, pre.id_antiquaire ");
        IF ( DB::isError($res) )
        {
            $db->rollback();
            return "Erreur dans la selection du nombre d'objets";
        }ELSE{
            $resPrest   = $db->query("SELECT deleteprestation(".$_GET['id'].")");
            IF ( DB::isError($resPrest) )
            {
                $db->rollback();
                return "Erreur dans l'execution de la procédure stockée : deleteprestation pour la prestation : ".$_GET['id'];
            }
            $row    = $res->fetchRow();
            $res->free();
            $nbAnt  = $row[0];
            $nbMax  = $row[1];
            $nbPre  = $row[2];
            $suppr  = $nbAnt - ( $nbMax - $nbPre );
            echo $suppr." = $nbAnt - ( $nbMax - $nbPre )";
            IF ($suppr > 0)
            {
                $res    = $db->query("SELECT id_objet ".
                                        "FROM objet_commun ".
                                        "WHERE id_antiquaire = ".$row[3]." ".
                                        "ORDER BY date_modif ASC ".
                                        "LIMIT ".$suppr);
                IF ( DB::isError($res) )
                {
                    $res->free();
                    $db->rollback();
                    return "Erreur dans la selection d'un des objets";
                }ELSE{
                    WHILE ( $row = $res->fetchRow() )
                    {
                        $res2   = $db->query("deleteObjet(".$row[0].")");
                        IF ( DB::isError($res2) )
                        {
                            $res->free();
                            $db->rollback;
                            return "Erreur dans l'execution de la procédure stockée : deleteobjet pour l'objet ".$row[0];
                        }ELSE{
                            $tabObjet[] = $row[0];
                        }
                    }
                    $idObjet    = reset($tabObjet);
                    WHILE ( $idObjet != FALSE )
                    {
                        /**
                         *  Suppression des images de l'objets
                         */
                        $ret        = unlink("../../img/chargimages/objets/".$idObjet."*");
                        IF (!$ret)
                        {
                            echo "Les images de l'objets $idObjet n'ont pas pu être supprimé. Veuillez le faire manuellement, merci.";
                        }
                        // SUPPRESSION DU CACHE
                        $smarty->clear_cache(null,"Objet|".$idObjet);
                        $idObjet    = next($tabObjet);
                    }
                    $db->commit();
                    return TRUE;
                }
            }ELSE{
                $db->commit();
                return true;
            }
        } 
    }

    lorsque que j'ai une erreur avec la procedure stockée "deleteobjet", le rollback ne change rien. C'est comme si la transaction n'existait pas !!!

    A l'aide !!

  2. #2
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mars 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 251
    Points : 174
    Points
    174
    Par défaut
    Bon, j'ai compris ce que je n'avais aps compris.

    une procedure est une transaction, du coup ca ne revient pas en arriere !!
    Est-il tout de meme possible de forcer le rollback de la procedure ?
    Je pense que non donc je vais faire une procedure complete.

    Par contre, une prodeure qui en appelle une autre => le probleme ser le meme.

    En fait, j'aimerais ne pas dupliquer le code et reutilsier mes procedures deja existante. j'ai vraiment besoin d'une solution !!

    help !!!

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Janvier 2005
    Messages : 41
    Points : 38
    Points
    38
    Par défaut
    Normalement pour utiliser le commit et le rollback, il faut "ouvrir" un transaction (de mémoire "BEGIN WORK" à verifier sur la doc officielle)

    Tu utlises un objet php $db.
    Or il est un peu difficile de réponde a ta question dans savoir ce que fait cette classe!

    il faudrait regarder les dans les méthode de cette classe si il existe une méthode qui permer l'ouverture d'une transaction.
    Si non tu peux essayer de rajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $db->query("BEGIN WORK;");
    au debut de ton script
    si tu fais un rollback il ne tient pas compte des requetes que tu as lancé apres le BEGIN WORK

    Tiens moi au courant si ca a fonctionné ca m'interresse

    Moog

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Janvier 2005
    Messages : 41
    Points : 38
    Points
    38
    Par défaut
    une procedure est une transaction, du coup ca ne revient pas en arriere !!
    C'est vrai en cas d'erreur dans ta fonction le traitement qui est inclu dans ta fonction n'est pas pris en compte.

    Une méthode un peu batarde mais qui devrait fonctionner serai de créer une seule fonction qui appelle toutes les autres.

  5. #5
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mars 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 251
    Points : 174
    Points
    174
    Par défaut
    oui, j'utilise PEAR DB !

    ca gere les transactions sans problemes.
    DU coup, j'ai fait une procedure complete plutot qu'une transaction qui appelle plusieurs procedures. Ca permet de gerer les erreurs mmais par contre le code est dupliqué a certains endroits !!!

    Pas tip top

Discussions similaires

  1. Transact SQL - Procédure stockée
    Par koolWak dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 18/12/2012, 09h41
  2. [TRANSACT] Appel Procédure stockée
    Par Virgile59 dans le forum Développement
    Réponses: 2
    Dernier message: 13/02/2009, 12h33
  3. Procédure stockée, transact SQL et param de type INT
    Par Samish dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/04/2006, 10h01
  4. Réponses: 2
    Dernier message: 20/03/2006, 09h39
  5. Procédure stockée et 'rollback transaction'
    Par thomas_strass dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/02/2006, 14h44

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