Mysql
 sql >> Database >  >> RDS >> Mysql

Perché questo ciclo non mostra un conteggio di oggetti aggiornato ogni cinque secondi?

Perché Python DB API è per impostazione predefinita in modalità AUTOCOMMIT=OFF e (almeno per MySQLdb) a livello di isolamento REPEATABLE READ. Ciò significa che dietro le quinte hai una transazione di database in corso (InnoDB è un motore transazionale) in cui il primo accesso a una determinata riga (o forse anche a una tabella, non ne sono sicuro) corregge la "vista" di questa risorsa per la parte rimanente di la transazione.

Per evitare questo comportamento, devi "aggiornare" la transazione corrente:

  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)

-- nota che il transaction.autocommit decorator serve solo per accedere alla modalità di gestione delle transazioni (questo può essere fatto anche manualmente usando le funzioni transaction.enter_transaction_management/leave_transaction_managemen).

Un'altra cosa - da tenere presente - l'autocommit di Django non è lo stesso autocommit che hai nel database:è completamente indipendente. Ma questo non rientra nell'ambito di questa domanda.

Modificato il 22/01/2012

Qui è una "risposta gemella" a una domanda simile.