Page 1 sur 2

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

Posté : 09 oct. 2011, 21:27
par two3d
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

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 09 oct. 2011, 21:53
par Cyrano
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.

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 09 oct. 2011, 22:13
par two3d
Salut Cyrano,

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

on parlent bien du "Moteur de stockage" ?

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 09 oct. 2011, 22:28
par Cyrano
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.

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 09 oct. 2011, 22:51
par two3d
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 ?

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 09 oct. 2011, 22:57
par moogli
salut,

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

@+

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 09 oct. 2011, 22:59
par Cyrano
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...

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 10 oct. 2011, 09:04
par two3d
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:

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 10 oct. 2011, 11:03
par Cyrano
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.

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 10 oct. 2011, 12:38
par two3d
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 ?

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 10 oct. 2011, 12:42
par zeus
Modération
Le sujet est déplacé dans un forum qui correspond plus au problème

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 10 oct. 2011, 12:42
par Cyrano
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.

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 10 oct. 2011, 23:29
par zeus
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.

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 11 oct. 2011, 21:44
par two3d
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?

Re: beginTransaction(), commit() et rollBack() ne fonctionne

Posté : 17 janv. 2012, 12:25
par gaten
Quelle est la classe que tu utilises pour gérer tes requètes et beginTransaction : Roolback ?