je je thread dans un démon, qui boucle et exécute la requête suivante:Comment désactiver la mise en cache correctement dans Sqlalchemy orm session?
try:
newsletter = self.session.query(models.Newsletter).\
filter(models.Newsletter.status == 'PROCESSING').\
limit(1).one()
except sa.orm.exc.NoResultFound:
self.logger.debug('No PROCESSING newsletters found. Sleeping...')
self.sleep()
return
# (...) more code to do with found newsletter
Lorsque la méthode de sommeil arrête simplement l'exécution de ce fil pendant le temps configuré et les rendements des états de retour à la boucle principale. Cependant, j'ai trouvé que si je change le statut de la newsletter en 'TRAITEMENT' pendant que le démon fonctionne, rien ne se passe, c'est à dire. la requête soulève toujours NoResultFound. Si je redémarre le démon cependant, il trouvera la newsletter. Donc, je vois, que les résultats de cette requête doivent être mis en cache. Que puis-je faire pour invalider le cache? session.expire_all() ne fonctionne pas. Je pourrais aussi créer un nouvel objet Session() à chaque itération, mais je ne sais pas si c'est une bonne approche concernant les ressources du système.
hypothèses Bad de votre part. Savez-vous comment votre base de données sérialise ces deux transactions? Savez-vous quels verrous de base de données sont impliqués dans ces deux transactions? Comment savez-vous que c'est un cache SQLAlchemy? Il est tout aussi susceptible d'être un verrou de base de données qui empêche la mise à jour jusqu'à ce que la requête se termine, car la requête supprime les mauvais verrous. Avez-vous des preuves de mise en cache? Ou est-ce une supposition? –
Je n'ai aucune preuve. Juste une supposition. Peut-être que la mise en cache est faite ailleurs. Utiliser rollback() semble fonctionner ici. – zefciu
Il est plus probable que ce soit ** pas ** la mise en cache, mais le verrouillage. –