Vous n'êtes pas identifié(e).

#1 18/09/2013 18:43:55

pljavabruno
Membre

problèmes sur les transactions PostgreSQL avec PHP 5

Bonjour à tous et à toutes,
j'ai un petit souci depuis ce matin sur mes transaction. En fait, j'ai ce bout de code en PHP.
$obj = new Groupe();
            $commande = new Ligneprivillege();
            $obj->setId($_POST['idcache']);
            try
            {
                $db->beginTransaction();
                    $obj->SaveToDB();
                    for($i=2; $i<20; $i++)
                    {
                        if($_POST['commande_'.$i.''] !=0)
                        {
                            $commande->SaveToDB($_POST['commande_'.$i.'']);
                        }                               
                    }                   
                $db->commit();
                echo'opération réalisée avec succès';
            }catch(Zend_Exception $e)
            {
                $db->rollback();
                echo'Echec de la transaction à cause de:'.$e->getMessage();
            }

Mais quand  $obj->SaveToDB(); réussi  et  $commande->SaveToDB($_POST['commande_'.$i.'']); échoue, tous n'est pas annulés la première enregistre les infos dans la Base de données.

Y a t il un problème dans ce bout de code ? 
comment activer les transaction sur PostgreSQL ?

merci pour votre contribution.

Hors ligne

#2 18/09/2013 19:57:32

gleu
Administrateur

Re : problèmes sur les transactions PostgreSQL avec PHP 5

Il va falloir expliquer ce que font les méthodes beginTransaction, SaveToDB et commit pour qu'on puisse vous aider. Et le mieux pour vous serait de tracer toutes les requêtes et de voir les requêtes dans les traces de PostgreSQL. Ça vous permettra de voir réellement ce qu'il se passe.

Sans plus d'infos, je ne serais pas étonné outre mesure que SaveToDB fasse un commit sans vous le dire.

Quant à activer les transactions, sur PostgreSQL, elles le sont toujours. Il n'y a pas de moyen de désactiver le système transactionnel de PostgreSQL.


Guillaume.

Hors ligne

#3 19/09/2013 09:36:37

pljavabruno
Membre

Re : problèmes sur les transactions PostgreSQL avec PHP 5

beginTransaction est l'instruction de début de la transaction, comme c'est la cas sur MySQL. SaveToDB fait tout un inset, c'est à dire que dans cette méthode,j'ai rien qu'une instruction INSERT INTO. Quant à commit, il applique tout juste le COMMIT (opposé de roolback)

Merci pour votre soutient.

Dernière modification par pljavabruno (19/09/2013 09:43:39)

Hors ligne

#4 19/09/2013 14:04:42

gleu
Administrateur

Re : problèmes sur les transactions PostgreSQL avec PHP 5

Comme dit plus haut, tracer les requêtes qui arrivent à PostgreSQL (le plus simple étant de configurer log_min_duration_statement à 0). Vous verrez exactement ce qu'il se passe. En tout cas, il est certain que "BEGIN; INSERT; INSERT (avec erreur); COMMIT" fait qu'aucun des deux INSERT n'est enregistré. Donc soit beginTransaction n'envoie pas de BEGIN soit SaveToDB fait un COMMIT.


Guillaume.

Hors ligne

#5 19/09/2013 18:47:40

SQLpro
Membre

Re : problèmes sur les transactions PostgreSQL avec PHP 5

Vos méthodes beginTransaction(), SaveToDB() et commit() / rollback() partagent-elle la même connexion et celle-ci reste t-elle ouverte entre les différentes commandes ?

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

#6 10/10/2013 09:54:36

pljavabruno
Membre

Re : problèmes sur les transactions PostgreSQL avec PHP 5

""  Vos méthodes beginTransaction(), SaveToDB() et commit() / rollback() partagent-elle la même connexion et celle-ci reste t-elle ouverte entre les différentes commandes ?""

c'est le meme objet PDO que j'instancie au début et je l'utilise par la suite.
 
je n'ai pas toujours eu de solutions à mon problème. Je précise ici que j'utilise PDO  et le composant ZendDB   de ZendFramework.
à ma connaissance, je pense que ce ne sont que les instructions DDL  (Data Définition Language) qui font un COMMIT par défaut.

y  a t- il un moyen de savoir si une requête fait un commit par défaut ?

Merci de m'aider.

Hors ligne

#7 10/10/2013 13:23:40

gleu
Administrateur

Re : problèmes sur les transactions PostgreSQL avec PHP 5

Ça ne fera que la troisième fois que je le dirais : "tracer les requêtes qui arrivent à PostgreSQL (le plus simple étant de configurer log_min_duration_statement à 0). Vous verrez exactement ce qu'il se passe."


Guillaume.

Hors ligne

Pied de page des forums