J'ai fait une emballage de base de données avec une fonctionnalité supplémentaire autour du système PDO (oui, je connais un wrapper autour d'une enveloppe, mais il ne s'agit que d'une fonctionnalité supplémentaire). Mais j'ai remarqué un problème.
Le follage ne fonctionne pas comme si cela devrait être: p> Le Var_Dump montre que les fonctions de begintransaction et de restauration retourne vrai, donc non Erreurs. P> Je m'attendais à ce que le premier appel Print_R montrent une matrice d'éléments N et le deuxième appel Afficher les éléments N-1. Mais cet IS n'est pas vrai, ils affichent tous les deux le même nombre d'articles. P> My $ DB-> Query ( Donc, je pense que je pense ou que le système de transaction de MySQL ne fonctionne pas, ni les implantimations de PDO ne fonctionnent pas ou je vois quelque chose de mal . P> Est-ce que quelqu'un sait que le problème est? p> p>
5 Réponses :
Vérifiez si votre type de base de données est égal à InnoDB. En un mot, vous devez vérifier si votre base de données prend en charge les transactions. P>
C'était la solution. Mais l'étrange chose est, pourquoi PDO ne renvoie pas faux (ou lancez une exception) tout en utilisant des transactions sur myisam ... étrange.
Vous pouvez toujours avoir une transaction avec Myisam - il ne peut tout simplement pas rouler. Cela signifie que la transaction est un non-op. Vous pouvez même mélanger des tables transactionnelles et non transactionnelles dans la même transaction - qui devient simplement déroutante. Normalement (dans la majorité des cas), vous voudrez que toutes vos tables soient innovées.
mySQL ne prend pas en charge les transactions sur le type de table Myisam, qui est malheureusement le type de table par défaut. P>
Si vous avez besoin de transactions, vous devez passer au type de table Innodb. P>
Deux problèmes possibles: p>
La table est myisam qui ne prend pas en charge la transaction. Utilisez INNODB. P> LI>
Vérifiez pour vous assurer que la commission automatique est désactivée. P> li> ol>
Pourquoi devraient-ils être stagiaires si je commence une transaction explicite?
Je sais que cela comme une réponse, comme un commentaire est à petite pour contenir les éléments suivants:
PDO n'est qu'une enveloppe autour des différentes bibliothèques d'interface de base de données de niveau inférieur. Si la bibliothèque de bas niveau ne se plaint pas, soit PDO. Étant donné que MySQL prend en charge les transactions, aucune opération de transaction ne renvoie une erreur de syntaxe ou autre chose. Vous pouvez utiliser des tables MyISAM dans les transactions, mais toutes les opérations effectuées sur eux seront effectuées comme si elles seront toujours actives: p> comme vous pouvez le constater, même si une transaction était actif et certaines actions ont été effectuées sur la table Myisam, aucune erreur n'a été lancée. p> p>
Query OK, 0 rangées affectées, 1 AVERTISSEMENT (0,00 SEC) Vous pouvez peut-être récupérer s'il s'agit d'avertissements
Bon point. Voici les avertissements Sortie après que je redouis les inserts de test / Rollback: Certaines tables modifiées non transactionnelles n'ont pas pu être roulés code>
Une autre raison pour laquelle cela peut arriver est de certains types d'instructions SQL entraînent une commission automatique immédiate. J'ai eu un grand script qui a couru dans une transaction qui se valait immédiatement et ignorait la transaction. J'ai finalement découvert que c'était parce que tout Types de déclarations qui causent les commentations automatiques sont les suivantes: P>
Plus d'infos et une liste complète Vous trouverez ici: https://dev.mysql.com/doc/refman/8.0/fr/implicit-commit.html p>
Si vous avez ce problème uniquement avec un script spécifique et que vous utilisez vous utilisez InnoDB, vous souhaiterez peut-être consulter pour voir si des instructions SQL de votre script correspondent à celles-ci. P> alter Table de table code> entraîne immédiatement un engagement de s'engager. P>
alter Table Table code>,
Créer une table code>, etc. li>
alter utilisateur code> ou
SET Mot de passe code> li>
Analyze Tableau code>,
Flush code> ou
index de cache code> li> li>