Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que esse loop não exibe uma contagem de objetos atualizada a cada cinco segundos?


Porque o Python DB API está por padrão no modo AUTOCOMMIT=OFF e (pelo menos para MySQLdb) no nível de isolamento REPEATABLE READ. Isso significa que nos bastidores você tem uma transação de banco de dados em andamento (InnoDB é um mecanismo transacional) na qual o primeiro acesso a determinada linha (ou talvez até tabela, não tenho certeza) corrige a "visualização" desse recurso para a parte restante do a transação.

Para evitar esse comportamento, você deve 'atualizar' a transação atual:
  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)

-- observe que o transaction.autocommit decorador serve apenas para entrar no modo de gerenciamento de transações (isso também pode ser feito manualmente usando as funções transaction.enter_transaction_management/leave_transaction_managemen).

Mais uma coisa - para estar ciente - o autocommit do Django não é o mesmo autocommit que você tem no banco de dados - é completamente independente. Mas isso está fora do escopo para esta questão.

Editado em 22/01/2012


Aqui é uma "resposta gêmea" para uma pergunta semelhante.