Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'ai un problème avec un mes transactions.
but : J'essaie de faire plusieurs mises à jour sur une table. si une requête n'a pas fonctionnée, ou si les données ne sont pas cohérentes (suite à un test), je veux annuler toutes les dernières requêtes et revenir à l'état initial de ma base.
Pour celà, j'essaie d'utiliser une transaction et le commit/rollback.
Le problème est que quoi que je fasse, le rollback ne semble pas fonctionner. Il doit y avoir un auto commit activé, mais impossible de trouver comment le désactiver.
$db = Zend_Registry::get('db'); $db->beginTransaction(); try { $db -> query("update matable set champ1 = 13 where id = 3"); $db -> query("update matable_erreur set champ1 = 14 where id = 4"); $db->commit(); } catch (Exception $e) { $rb = $db -> rollback();Zend_Debug::dump($rb, 'rollback'); Zend_Debug::dump('Rollback -> '.$e -> getMessage(), 'message'); }
Affichage du débug :
rollback boolean true message string 'Rollback -> SQLSTATE[42S02]: Base table or view not found: 1146 Table 'mabase.matable_erreur' doesn't exist' (length=111)
Par contre, dans la base, la 1ère requête a été exécutée, la colonne champ1 vaut bien 13 pour la ligne id=3. La transaction n'a donc pas été annulée.
Savez vous comment désactiver l'autocommit avec Zend_db pour pdo_mysql ?
Merci d'avance,
Laurent
Hors ligne
Je ne pense pas que ce soit à Zend_Db de faire cela.
http://dev.mysql.com/doc/refman/5.0/fr/commit.html
Hors ligne
ce n'est pas un pb d'auto commit si tu fais une transaction
$db->beginTransaction();
l'auto comit n'est pas pris en compte par MySQL
non ton problème vient de MySQL lui même
Dans MySQL si ton moteur de base de données ne supporte pas les transactions (et c'est le cas le plus courant avec MySQL) les commande SQL BEGIN TRANSACTION COMMIT ET ROLLBACK n'ont aucun effets.
pour beneficier du mode transactionnel il faut que toutes les tables de ta base entrant dans la transaction utilise un moteur transactionnel comme INNODB. mais attention cela a un revers la base double de volume et côté perf ce n'est plus du tout la même chose.
perso pour du transactionnel je préfère de loin PostgreSQL
A+JYT
Hors ligne
Bonjour,
Merci de vos réponses.
Mes bases sont en MyISAM et non INNODB, ça doit être pour ça !
Je prèfère également PostgreSQL, mais sur ce projet je n'ai pas eu le choix.
Tant pis, je ferais autrement.
Merci,
Laurent
Hors ligne