Vous n'êtes pas identifié(e).
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
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
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
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
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
"" 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
Ç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