Maison > base de données > tutoriel mysql > Comment résoudre l'erreur MySQL « Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives » ?

Comment résoudre l'erreur MySQL « Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives » ?

Patricia Arquette
Libérer: 2024-12-07 17:03:12
original
981 Les gens l'ont consulté

How to Solve the MySQL Error

Résolution de l'erreur « Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives » avec MySQL

Introduction :

Le protocole client MySQL impose une limitation selon laquelle une seule requête peut être exécutée simultanément. Lorsqu'ils tentent d'exécuter des requêtes supplémentaires alors que les résultats des requêtes précédentes ne sont pas récupérés, les utilisateurs peuvent rencontrer l'erreur « Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives ». Ce problème peut survenir dans des scénarios spécifiques, en particulier lorsque PHP Data Objects (PDO) est utilisé avec l'attribut PDO::ATTR_EMULATE_PREPARES défini sur false.

Cause :

Le La cause première réside dans l'incapacité du protocole client MySQL à avoir plusieurs requêtes en cours simultanément. Une fois qu'une requête est exécutée, la bibliothèque client récupère automatiquement tous ses résultats et les met en cache, permettant aux récupérations ultérieures de parcourir les résultats stockés sans communiquer avec MySQL. Cette approche, connue sous le nom de « requêtes tamponnées », libère le serveur MySQL de tout traitement ultérieur une fois les résultats initiaux récupérés.

À l'inverse, les requêtes sans tampon ne mettent pas les résultats en cache, ce qui oblige le client à les récupérer un par un. Cette contrainte survient lorsqu'une deuxième requête est exécutée avant que les résultats de la première requête n'aient été entièrement récupérés. Le serveur MySQL interprète cela comme un conflit entre requêtes actives et déclenche le message d'erreur.

Résolution :

Pour résoudre ce problème, les stratégies suivantes peuvent être utilisées :

  • Utilisez fetchAll() : En appelant la méthode fetchAll(), tous les résultats d'une requête sont récupéré et mis en cache en PHP. Cette approche simule efficacement une requête mise en mémoire tampon, permettant aux requêtes suivantes de s'exécuter sans rencontrer l'erreur.
  • Activer PDO::MYSQL_ATTR_USE_BUFFERED_QUERY : Définir cet attribut PDO sur true force l'utilisation de requêtes mises en mémoire tampon, quel que soit le paramètre PDO::ATTR_EMULATE_PREPARES. Cette méthode garantit que tous les résultats sont récupérés implicitement lors de la première récupération, évitant ainsi les conflits avec les requêtes suivantes.
  • Fermez vos curseurs : l'appel de closeCursor() sur une requête informe explicitement le serveur MySQL que son les résultats peuvent être rejetés. Cela permet l'exécution de nouvelles requêtes sans rencontrer l'erreur. Il convient de noter que closeCursor() ne doit être utilisé qu'une fois que tous les résultats escomptés ont été récupérés.

Considérations supplémentaires :

  • Le problème peut survenir par intermittence en raison de l'alternance des versions de PHP, car la compatibilité avec les bibliothèques clientes MySQL peut varier.
  • L'erreur apparaît le plus souvent lorsqu'il existe plusieurs requêtes actives, chaque requête impliquant un ensemble de résultats. de plus d'une ligne.
  • Le passage au pilote natif MySQL (mysqlnd) est recommandé, car il offre plus de fonctionnalités et de mémoire efficacité.

Exemple de code :

Le code fourni peut être modifié pour éviter l'erreur en utilisant fetchAll() ou en définissant explicitement PDO::MYSQL_ATTR_USE_BUFFERED_QUERY sur true .

$sql ='SELECT temp_id FROM temp1';
$stmt2 = db::db()->prepare($sql);
$stmt2->execute();
$rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);
$stmt2->closeCursor();

$sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes 
      WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id';
$stmt1 = db::db()->prepare($sql);

foreach($data AS $row)
{
    try
    {
        $stmt1->execute($row);
        $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC);
        $stmt1->closeCursor();
        syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand());
        syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand());
    }
    catch(PDOException $e){echo(sql_error($e));}            
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal