Emuler les transactions avec MyISAM ou autres base de données n'en disposant pas

Eléphant du PHP | 59 Messages

14 févr. 2009, 19:58

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

ViPHP
ViPHP | 1380 Messages

14 févr. 2009, 21:51

La méthode PDO::exec() retourne le nombre de lignes affectées. Avec ça tu devrais pouvoir tester si un insert à marché.
ripat

Eléphant du PHP | 59 Messages

14 févr. 2009, 22:22

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]

ViPHP
ViPHP | 1380 Messages

14 févr. 2009, 22:27

Pourquoi ne passes-tu pas tes tables en InnoDB?
ripat

Eléphant du PHP | 59 Messages

14 févr. 2009, 22:34

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 :)

ViPHP
ViPHP | 1380 Messages

15 févr. 2009, 10:17

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/
ripat

Mammouth du PHP | 19672 Messages

17 févr. 2009, 23:41

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: