Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/06/2005, 16h45   #1
Membre habitué
 
Avatar de Tchinkatchuk
 
Homme Sylvain Gourvil
Freelance en développement Web
Inscription : mars 2005
Messages : 248
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Gourvil
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Freelance en développement Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2005
Messages : 248
Points : 141
Points : 141
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 :
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 !!
Tchinkatchuk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2005, 17h37   #2
Membre habitué
 
Avatar de Tchinkatchuk
 
Homme Sylvain Gourvil
Freelance en développement Web
Inscription : mars 2005
Messages : 248
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Gourvil
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Freelance en développement Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2005
Messages : 248
Points : 141
Points : 141
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 !!!
Tchinkatchuk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2005, 18h42   #3
Membre à l'essai
 
Inscription : janvier 2005
Messages : 38
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : janvier 2005
Messages : 38
Points : 24
Points : 24
Envoyer un message via MSN à moog
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 :
$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
moog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2005, 18h45   #4
Membre à l'essai
 
Inscription : janvier 2005
Messages : 38
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : janvier 2005
Messages : 38
Points : 24
Points : 24
Envoyer un message via MSN à moog
Citation:
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.
moog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2005, 19h48   #5
Membre habitué
 
Avatar de Tchinkatchuk
 
Homme Sylvain Gourvil
Freelance en développement Web
Inscription : mars 2005
Messages : 248
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Gourvil
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Freelance en développement Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2005
Messages : 248
Points : 141
Points : 141
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
Tchinkatchuk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h23.


 
 
 
 
Partenaires

Hébergement Web