sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué este bucle no muestra un recuento de objetos actualizado cada cinco segundos?

Porque Python DB API está por defecto en modo AUTOCOMMIT=OFF y (al menos para MySQLdb) en el nivel de aislamiento de LECTURA REPETIBLE. Esto significa que detrás de escena tiene una transacción de base de datos en curso (InnoDB es un motor transaccional) en el que el primer acceso a la fila dada (o tal vez incluso a la tabla, no estoy seguro) corrige la "vista" de este recurso para la parte restante de la transacción.

Para evitar este comportamiento, debe 'actualizar' la transacción actual:

  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)

-- tenga en cuenta que transaction.autocommit decorador es solo para entrar en el modo de gestión de transacciones (esto también se puede hacer manualmente usando las funciones de transaction.enter_transaction_management/leave_transaction_managemen).

Una cosa más:tenga en cuenta que la confirmación automática de Django no es la misma confirmación automática que tiene en la base de datos:es completamente independiente. Pero esto está fuera del alcance de esta pregunta.

Editado el 22/01/2012

Aquí es una "respuesta gemela" a una pregunta similar.