6
votes

La restauration de la transaction ne fonctionne pas

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

Le Var_Dump montre que les fonctions de begintransaction et de restauration retourne vrai, donc non Erreurs.

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.

My $ DB-> Query (, ) appelez rien d'autre, puis pdo-> préparer ( ) -> Exécuter () (avec traitement d'erreur supplémentaire).

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 .

Est-ce que quelqu'un sait que le problème est?


0 commentaires

5 Réponses :


17
votes

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.


2 commentaires

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.



2
votes

mySQL ne prend pas en charge les transactions sur le type de table Myisam, qui est malheureusement le type de table par défaut.

Si vous avez besoin de transactions, vous devez passer au type de table Innodb.


0 commentaires

4
votes

Deux problèmes possibles:

  1. La table est myisam qui ne prend pas en charge la transaction. Utilisez INNODB.

  2. Vérifiez pour vous assurer que la commission automatique est désactivée.

    http://www.php.net/manual/fr/pdo .Transactions.php


1 commentaires

Pourquoi devraient-ils être stagiaires si je commence une transaction explicite?



3
votes

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

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.


2 commentaires

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



0
votes

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 alter Table de table entraîne immédiatement un engagement de s'engager.

Types de déclarations qui causent les commentations automatiques sont les suivantes:

  • tout ce qui modifie une table ou la base de données, telle que alter Table Table , Créer une table , etc.
  • tout ce qui modifie les autorisations de table, telles que alter utilisateur ou SET Mot de passe
  • tout ce qui verrouille ces tables ou commence une nouvelle transaction
  • Déclarations de chargement des données
  • instections administratives, telles que Analyze Tableau , Flush ou index de cache
  • Les déclarations de contrôle de réplication, telles que quelque chose à voir avec un esclave ou un maître

    Plus d'infos et une liste complète Vous trouverez ici: https://dev.mysql.com/doc/refman/8.0/fr/implicit-commit.html

    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.


0 commentaires