Dans les scripts Python, il est essentiel d'interroger fréquemment les bases de données MySQL pour capturer des données dynamiques. Lorsqu'on s'appuie sur des boucles pour récupérer de telles données, il peut être déroutant de constater que les récupérations suivantes renvoient des résultats identiques.
Dans le script Python donné, une boucle est utilisée pour exécuter à plusieurs reprises un MySQL interrogez et stockez les résultats dans une liste :
<code class="python">for i in range(listSize): # ... # SQL query sql = "SELECT * FROM table" # ...</code>
Malgré les attentes selon lesquelles la boucle actualiserait les données extraites de la base de données à chaque itération, le script récupère les mêmes résultats à plusieurs reprises.
Le nœud du problème réside dans les niveaux d'isolation des transactions de MySQL. Par défaut, InnoDB, le moteur de stockage utilisé par MySQL, fonctionne sous le niveau d'isolement READ COMMITTED, qui garantit ce qui suit :
"Des lectures cohérentes au sein de la même transaction lisent l'instantané établi par la première lecture."
Cela signifie que les requêtes ultérieures au sein d'une transaction récupèrent les données telles qu'elles existaient au moment du lancement de la transaction. Pour résoudre ce problème, chaque itération de la boucle doit se terminer par une commande mydb.commit().
<code class="python">import ... # ... while True: # ... # SQL query sql = "SELECT * FROM table" # ... mydb.commit()</code>
En validant la connexion, le script force la base de données à capturer les modifications apportées au cours de la transaction, garantissant que les modifications ultérieures les requêtes reflètent l'état actuel de la base de données.
Chaque itération de boucle au sein d'une connexion MySQL est traitée comme une transaction distincte, qui lit par défaut à partir d'un instantané cohérent. La validation de la connexion à la fin de chaque itération garantit que la transaction suivante lit l'instantané le plus récent, reflétant les modifications apportées lors de la transaction précédente.
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!