Maison >base de données >tutoriel mysql >Pourquoi MySQL renvoie-t-il l'erreur 2014 : « Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives » ?

Pourquoi MySQL renvoie-t-il l'erreur 2014 : « Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives » ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-23 15:42:10826parcourir

Why Does MySQL Return Error 2014:

Causes de l'erreur MySQL 2014 : impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives

Le protocole client de MySQL restreint l'exécution simultanée de plusieurs requêtes lorsque les résultats d'une requête précédente n'ont pas été entièrement récupérés. Cette limitation est due à la nature sans tampon de certaines requêtes, dans lesquelles les lignes sont récupérées de manière incrémentielle au lieu d'être immédiatement mises en cache comme dans les requêtes mises en mémoire tampon.

Lors de l'exécution d'une requête sans tampon et de la tentative d'exécution d'une autre requête avant de récupérer toutes les lignes du Tout d'abord, MySQL renvoie l'erreur "Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives."

Émulé Déclarations préparées

PDO::ATTR_EMULATE_PREPARES spécifie si les instructions préparées sont émulées ou exécutées en tant qu'instructions préparées MySQL natives. Si la valeur est false, l'utilisation de requêtes PHP sans tampon peut déclencher l'erreur 2014. En effet, le mécanisme de mise en cache interne de PHP pour les résultats des requêtes ne gère pas correctement les requêtes sans tampon.

Résoudre l'erreur

Il existe plusieurs façons de résoudre cette erreur :

  • Utilisez Requêtes tamponnées : L'activation de PDO::MYSQL_ATTR_USE_BUFFERED_QUERY entraîne l'exécution des requêtes en mode tamponné, qui récupère automatiquement toutes les lignes à la fois. Cependant, cela peut consommer beaucoup de mémoire si l'ensemble de résultats est volumineux.
  • Récupérer toutes les lignes : L'appel de fetchAll() sur une requête garantit que toutes les lignes sont récupérées et que le curseur de résultat est fermé. , permettant l'exécution des requêtes suivantes sans erreur.
  • Fermer le curseur :Fermer le curseur avec closeCursor() libère les ressources MySQL associées à la requête sans tampon et permet l'exécution des requêtes suivantes. Cependant, cela empêche la récupération des lignes restantes de la requête sans tampon.

Bonnes pratiques

Pour éviter de rencontrer cette erreur, il est recommandé de :

  • Utilisez les requêtes tamponnées ou fetchAll() par défaut pour les requêtes non tamponnées qui récupèrent un nombre limité de lignes.
  • Évitez d'imbriquer les requêtes si cela n'est pas nécessaire, car l'exécution de la requête interne plusieurs fois dans une boucle peut aggraver l'erreur.
  • Fermez les curseurs lorsque vous avez fini de récupérer les données pour libérer les ressources du serveur. et évitez que l'erreur ne se produise.
  • Envisagez de migrer vers le pilote mysqlnd, qui est plus économe en mémoire et prend en charge les émulés préparés. déclarations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn