Page 1 sur 1

Emuler les transactions avec MyISAM ou autres base de donnée

Posté : 14 févr. 2009, 19:58
par dimalta5
Bonjour,

J'utilise PDO dans toutes mes applications pour qu'elles soient portables et réutilisables (autant que possible).

La seule chose qui me manque vraiment c'est un moyen d'avoir l'équivalent des transactions lorsqu'elles ne sont pas disponibles comme avec MyISAM.

La plupart du temps mes problèmes sont assez simples:
Par exemple:
3 INSERT successifs et je voudrais que si l'un des trois ne passe pas que les deux autres ne soient pas effectués.

Merci d'avance pour vos réponses

Posté : 14 févr. 2009, 21:51
par Ripat
La méthode PDO::exec() retourne le nombre de lignes affectées. Avec ça tu devrais pouvoir tester si un insert à marché.

Posté : 14 févr. 2009, 22:22
par dimalta5
Oui mais le plus embêtant c'est quand il faut annuler celles qui ont marché correctement si jamais il y en a une qui n'a pas fonctionné.

J'ai l'impression qu'il est possible de réduire les risques de corruptions des données mais pas de les éliminer comme avec de vrai transactions.

Mais les réduire c'est déjà intéressant

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 14 févr. 2009, 22:27
par Ripat
Pourquoi ne passes-tu pas tes tables en InnoDB?

Posté : 14 févr. 2009, 22:34
par dimalta5
Parce qu'il y a certaines applications que je souhaite pouvoir réutiliser dans différents projets et je peux pas savoir à l'avance quels types de bases de données sera utilisée.

D'un autre côté d'après ce comparatif quasiment toutes les bases de données à par MyISAM supportent les transactions:
http://en.wikipedia.org/wiki/Comparison ... nt_systems

Donc au final je laisserai tomber la compatibilité de mon application avec MyISAM, ADABAS, LucidDB et Valentina... Oui je crois que je peux survivre sans ces 4 la finalement :)

Posté : 15 févr. 2009, 10:17
par Ripat
Rien ne t'empêche d'utiliser les méthodes PDO::BeginTransaction et PDO::commit sur des tables MyISAM, elles seront juste sans effets et ne produiront aucune erreur. Tu peux donc développer de manière portable tout en sachant que les transactions ne marcheront pas sur MyISAM. Quant à la nécessité des transactions, ça dépend de ton application. Si vraiment tu as besoin d'un SGBD ACID, laisse tomber MyISAM car même si tu manipules la classe PDO pour émuler les transactions, le moteur n'est pas prévu pour ça et tu risques de faire plus de mal que de bien.

Article intéressant sur les raisons de choisir InnoDB plutôt que MyISAM:
http://www.mysqlperformanceblog.com/200 ... to-innodb/

Posté : 17 févr. 2009, 23:41
par Cyrano
Une idée comme ça :

Si tu fais une transaction comprenant diverses requêtes d'insertion avec un moteur MyISAM, tu devrais pouvoir récupérer chaque clé primaire générée avec chaque nouvelle ligne. Partant de là, si tu insères des données sur différentes tables, tu stockes au fur et à mesure dans un tableau les clé primaires, un truc du genre :
$insertions = array(
    'table_1' => array(),
    'table_2' => array(),
    //...
    'table_n' => array()
);
Remplace les "table_1", "table_2" etc.. par les vrais noms des tables.

En cas de plantage, tu disposeras des informations suffisantes pour effectuer un delete sur les lignes correctement insérées au cas où une planterait.