Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi cette boucle n'affiche-t-elle pas un nombre d'objets mis à jour toutes les cinq secondes ?

Parce que l'API Python DB est par défaut en mode AUTOCOMMIT=OFF, et (au moins pour MySQLdb) au niveau d'isolation REPEATABLE READ. Cela signifie que dans les coulisses, vous avez une transaction de base de données en cours (InnoDB est un moteur transactionnel) dans laquelle le premier accès à une ligne donnée (ou peut-être même à une table, je ne suis pas sûr) corrige la "vue" de cette ressource pour la partie restante de la transaction.

Pour éviter ce comportement, vous devez "rafraîchir" la transaction en cours :

  from django.db import transaction


  @transaction.autocommit  
  def my_count():     
      while True:
          transaction.commit()
          print "Number of Things: %d" % Thing.objects.count()
          time.sleep(5)

-- notez que la transaction.autocommit le décorateur sert uniquement à entrer en mode de gestion des transactions (cela peut également être fait manuellement à l'aide des fonctions transaction.enter_transaction_management/leave_transaction_managemen).

Une dernière chose - à savoir - l'autocommit de Django n'est pas le même autocommit que vous avez dans la base de données - il est complètement indépendant. Mais cela est hors de portée pour cette question.

Modifié le 22/01/2012

Ici est une "réponse jumelle" à une question similaire.