Discussion:
Transaction PDO non annulee
(trop ancien pour répondre)
jacfev
2010-08-12 20:08:08 UTC
Permalink
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.
Bruno Baguette
2010-08-13 11:14:14 UTC
Permalink
Post by 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.
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
2010-08-13 16:39:42 UTC
Permalink
Bonjour,
Post by Bruno Baguette
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
Bruno Baguette
2010-08-13 20:28:35 UTC
Permalink
Post by jacfev
Bonjour,
Post by Bruno Baguette
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
2010-08-13 21:18:24 UTC
Permalink
Re,
Post by Bruno Baguette
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

jacfev
2010-08-13 17:22:11 UTC
Permalink
InnoDB OK.
J'avais trouvé depuis (ça fait plus d'une semaine que j'avais envoyé ce post
!)
Merci quand même Bruno.
Post by Bruno Baguette
Post by 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.
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
Mickael Wolff
2010-08-13 11:14:14 UTC
Permalink
Post by jacfev
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
Continuer la lecture sur narkive:
Loading...