Transaction PDO non annulee

Le
jacfev
Bonjour,

Dans l'exemple simple ci-dessous, en PDO, la transaction n'est pas annulée
(la première requête est exécutée quand même) alors qu'il y a une erreur
(volontaire) dans la 2ème requête.
Auncune des requêtes ne devrait être exécutée puisqu'il s'agit d'une
transaction.

Il me semble pourtant avoir respecté les indications de :
http://fr.php.net/manual/fr/pdo.transactions.php

Mon exemple qui pose problème :

<?php
include_once('connect.inc.php');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
try {
$sql = "INSERT INTO auteur (login, nom, prenom)
VALUES ('Max', 'Havelard', 'isGood')";
$dbh->exec($sql);
// syntaxe incorrecte ici volontairement (titlre au lieu de titre)
$sql2 = "INSERT INTO article (titlre, texte, auteur)
VALUES ('PHP 5 V5 !', 'il est sorti', 'Max')";
$dbh->exec($sql2);
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
echo "Echec: ".$e->getMessage();
}
?>

Le fichier connect.inc.php inclus

<?php
define('DSN1', 'mysql:host=localhost;dbname=publication');
define('USER1', 'cyril');
define('PASS1', 'motdepasse');
try {
$dbh = new PDO(DSN1, USER1, PASS1);
//utilisation de la connexion
} catch (PDOException $e) {
print "Erreur ! : ".$e->getMessage()."<br/>";
die();
}
?>

La base et les tables fonctionnent par ailleurs correctement.

Pour connaisseur en PDO;
Où est l'erreur ?
Cordialement
jf.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickael Wolff
Le #22467441
Le 12/08/2010 21:08, jacfev a écrit :
Il me semble pourtant avoir respecté les indications de :
http://fr.php.net/manual/fr/pdo.transactions.php



Tu devrais lire le cadre rose avec le panneau « danger » et vérifier
le type de tes tables ;)

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Bruno Baguette
Le #22467451
Le 12/08/10 22:08, jacfev a écrit :
Bonjour,

Dans l'exemple simple ci-dessous, en PDO, la transaction n'est pas
annulée (la première requête est exécutée quand même) alors qu'il y a
une erreur (volontaire) dans la 2ème requête. Auncune des requêtes
ne devrait être exécutée puisqu'il s'agit d'une transaction.



Bonjour !

La première idée qui me vient à l'esprit serait de vérifier que votre
table ne serait pas au format MyISAM.

Si tel est le cas, passez votre table au format InnoDB et votre problème
devrait être ainsi résolu !

Très cordialement,

--
Bruno Baguette
John GALLET
Le #22468771
Bonjour,

La première idée qui me vient à l'esprit serait de vérifier que votre
table ne serait pas au format MyISAM.



Pour des données, je comprendrais, mais sur une erreur de syntaxe SQL,
si c'est la solution, c'est pas intuitif comme comportement.

JGA
jacfev
Le #22469031
InnoDB OK.
J'avais trouvé depuis (ça fait plus d'une semaine que j'avais envoyé ce post
!)
Merci quand même Bruno.

"Bruno Baguette" i420ad$1pnc$
Le 12/08/10 22:08, jacfev a écrit :
Bonjour,

Dans l'exemple simple ci-dessous, en PDO, la transaction n'est pas
annulée (la première requête est exécutée quand même) alors qu'il y a
une erreur (volontaire) dans la 2ème requête. Auncune des requêtes ne
devrait être exécutée puisqu'il s'agit d'une transaction.



Bonjour !

La première idée qui me vient à l'esprit serait de vérifier que votre
table ne serait pas au format MyISAM.

Si tel est le cas, passez votre table au format InnoDB et votre problème
devrait être ainsi résolu !

Très cordialement,

--
Bruno Baguette
Bruno Baguette
Le #22469521
Le 13/08/10 18:39, John GALLET a écrit :
Bonjour,

La première idée qui me vient à l'esprit serait de vérifier que
votre table ne serait pas au format MyISAM.



Pour des données, je comprendrais, mais sur une erreur de syntaxe
SQL, si c'est la solution, c'est pas intuitif comme comportement.

JGA



AMHA, on ne peut pas vraiment reprocher ce comportement à PDO.

PDO s'adresse à un SGBD (dans le cas présent : MySQL), mais ne connait
pas le type de table qui se trouve derrière (MyISAM, InnoDB, ...).

Avec le moteur MyISAM, si vous faites un BEGIN; ou que vous déclarez des
constraintes FOREIGN KEY, le moteur acceptera ces commandes, mais ne les
appliquera pas.

Sans connaitre le code de PDO, c'est (une des) raisons que je devine
pour expliquer le comportement de PDO.

--
Bruno Baguette
John GALLET
Le #22469771
Re,

AMHA, on ne peut pas vraiment reprocher ce comportement à PDO.



Dans ce cas là, je confirme, c'est surtout que j'avais lu les
informations de travers: après une requête qui est correcte, une requête
volontairement incorrecte ne provoquait pas de rollback. Ce que j'avais
lu, c'était l'inverse, i.e. on continuait quand même la requête numéro 2
après une requête syntaxiquement incorrecte.
Aïe, non, pas la tête.

JGA
Publicité
Poster une réponse
Anonyme