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

Hvorfor viser denne sløjfe ikke en opdateret objekttælling hvert femte sekund?

Fordi Python DB API som standard er i tilstanden AUTOCOMMIT=OFF og (i det mindste for MySQLdb) på isolationsniveauet REPEATABLE READ. Dette betyder, at du bag kulisserne har en igangværende databasetransaktion (InnoDB er transaktionsmotor), hvor den første adgang til en given række (eller måske endda tabel, jeg er ikke sikker på) fikser "visning" af denne ressource for den resterende del af transaktionen.

For at forhindre denne adfærd skal du 'opdatere' den aktuelle transaktion:

  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)

-- Bemærk, at transaction.autocommit decorator er kun til at gå ind i transaktionsstyringstilstand (dette kan også gøres manuelt ved at bruge funktionerne transaktion.enter_transaction_management/leave_transaction_managemen).

En ting mere - for at være opmærksom - Djangos autocommit er ikke den samme autocommit, du har i databasen - den er fuldstændig uafhængig. Men dette er uden for dette spørgsmåls rækkevidde.

Redigeret den 22/01/2012

Her er et "tvillingsvar" på et lignende spørgsmål.




  1. Sådan bruger du RANK() i SQL Server

  2. Hvorfor tager Microsoft SQL Server 2012-forespørgsler minutter over JDBC 4.0, men sekund(er) i Management Studio?

  3. Tillad ikke-ascii-tegn i MySQL-databasen

  4. få nyt SQL record ID