beginTransaction(), commit() et rollBack() ne fonctionne pas

Avatar du membre
Mammouth du PHP | 1564 Messages

09 oct. 2011, 21:27

Bonjour,

j'aimerai avoir une explication svp car là je commence à m'arracher les cheveux :P

je m'explique, j'ai deux requêtes à exécuter et j'aimerai que si, une foire, les deux ne soit pas exécutées, d'où les fonctions beginTransaction(), commit() et rollBack().

Le problème: j'ai beau mettre ces trois fonction, rien y fait, une requête est quand exécutée #-o

alors je me suis dit que peut être il fallait une version de PHP suffisante (d'après quelque sources sur le web) (je tourne en local avec WAMPSERVER 2.0)
ou alors peut être définir un attribut (ATTR) lors de connexion à MySQL avec PDO ?


voici mon code (en exemple, je met pas tout car il est long):
<?php
try {

	$sth1 = $bdd->prepare("UPDATE table1 SET bidule = :bidule WHERE machin = :machin");
	$sth2 = $bdd->prepare("INSERT INTO table2 SET pseudo = :pseudo, mail = :mail");
	
	$bdd->beginTransaction();
	$sth1->execute(array(':bidule' => 'Bidule',':machin' => 'Machin'));
	$sth2->execute(array(':pseudo' => 'Albert',':mail' => '[email protected]'));
	$bdd->commit();
	
	echo "<p>UPDATE et INSERT ok !</p>";

} catch(Exception $e) {

	$bdd->rollBack();
	
	echo "<p>Une erreur s'est produite.</p>";
	echo "Erreur: ".$e->getMessage();
	echo "<br />Ligne: ".$e->getLine();
}
?>



Je vous remercie d'avance pour vos éventuelles réponses.
Cdt.
two3d

Mammouth du PHP | 19672 Messages

09 oct. 2011, 21:53

Est-ce que les tables concernées utilisent bien le moteur InnoDB : c'est le seul moteur transactionnel de MySQL et donc le seul avec lequel fonctionnent les transactions.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Mammouth du PHP | 1564 Messages

09 oct. 2011, 22:13

Salut Cyrano,

non justement, j'ai vérifié et les tables concernées sont en MyISAM.

on parlent bien du "Moteur de stockage" ?

Mammouth du PHP | 19672 Messages

09 oct. 2011, 22:28

Absolument, et le moteur MyISAM ne supporte pas les transaction, donc soit tu changes le moteur, soit tu ajustes les transactions par programmation, ce qui sera somme toute plus compliqué, pas impossible certes, mais pas simple du tout parce que ça veut dire que tu devras prévoir de récupérer les identifiants des données insérées et en cas de plantage d'une des requêtes faire exécuter d'autres requêtes DELETE correspondantes.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Mammouth du PHP | 1564 Messages

09 oct. 2011, 22:51

Merci de ta réponse mais le fait de passer en InnoDB cela ne risque pas de poser un problème en sachant que mes tables sont constamment en actions genre 100 INSERT / seconde ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 oct. 2011, 22:57

salut,

a voir chez mysql mais ça devrait pas, par contre si tu a une recherche full text cela ne fonctionnera plus !

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 19672 Messages

09 oct. 2011, 22:59

Le moteur InnoDB a pour « défaut » de ralentir un peu en mode écriture, mais ce ne devrait pas être nécessairement très significatif. Et de toutes façons si tu veux faire des transactions, tu n'as pas un choix considérable...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Mammouth du PHP | 1564 Messages

10 oct. 2011, 09:04

Bingo !!! testé et approuvé :)

Le fait de passé le moteur en InnoDB effectue bien une transaction.

PS: le fait de travailler en PDO obliger de passer toutes les tables en InnoDB ou c'est juste pour les transactions ?


Encore merci pour ta réponse :wink:

Mammouth du PHP | 19672 Messages

10 oct. 2011, 11:03

Tu peux parfaitement n'avoir que certaines tables avec InnoDB et d'autres avec un autre moteur, ça n'affecte pas du tout PDO, mais bien entendu pour les transactions, c'est automatiquement InnoDB. L'intérêt de pouvoir mixer les moteurs par contre, c'est que si certaines tables sont vraiment très sollicitées en lecture et beaucoup moins en écriture, il peut être préférable d'utiliser MyISAM qui sera beaucoup plus rapide.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Mammouth du PHP | 1564 Messages

10 oct. 2011, 12:38

Malheureusement ça va créer un malentendu car il me faudrait la table en MyISAM et en InnoDB.

ya t'il possibilité de change le moteur lors d'une requête utilisant une transaction et de le remettre ensuite en MyISAM ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 oct. 2011, 12:42

Modération
Le sujet est déplacé dans un forum qui correspond plus au problème
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 19672 Messages

10 oct. 2011, 12:42

Niet, pas possible, ou alors en effectuant une requête de modification juste avant les écritures et une autre fois juste après. Je ne le conseille pas du tout. La différence de vitesse ne justifie certainement pas une opération de ce genre, d'autant que ça veut dire deux requêtes de plus, juste ce temps d'exécution viendrait bouffer l'éventuel gain qui n'est même pas forcément garanti de façon significative.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 oct. 2011, 23:29

Surtout que le passage de myIsam à InnoDB s'accompagne par une création complète d'index, ce qui est très couteux.
En fait, le moteur de base de données à utiliser doit être réfléchi au début, et une bonne fois pour toute.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Mammouth du PHP | 1564 Messages

11 oct. 2011, 21:44

ok, je vous remercie pour vos réponses.

Je passe le sujet en résolu :wink:

[edit] j'ai pas trouvé le bouton "sujet résolu", vous savez où il se trouve svp?

gaten
Invité n'ayant pas de compte PHPfrance

17 janv. 2012, 12:25

Quelle est la classe que tu utilises pour gérer tes requètes et beginTransaction : Roolback ?