sql >> Database >  >> RDS >> Mysql

Waarom geeft deze lus niet elke vijf seconden een bijgewerkte objecttelling weer?

Omdat Python DB API standaard in AUTOCOMMIT=OFF-modus staat, en (tenminste voor MySQLdb) op REPEATABLE READ-isolatieniveau. Dit betekent dat je achter de schermen een lopende databasetransactie hebt (InnoDB is een transactie-engine) waarin de eerste toegang tot een bepaalde rij (of misschien zelfs een tabel, ik weet het niet zeker) de "weergave" van deze bron voor het resterende deel van de transactie.

Om dit gedrag te voorkomen, moet u de huidige transactie 'vernieuwen':

  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)

-- merk op dat de transaction.autocommit decorator is alleen bedoeld om de transactiebeheermodus te openen (dit kan ook handmatig worden gedaan met behulp van de functies transaction.enter_transaction_management/leave_transaction_managemen).

Nog een ding - om op te letten - Django's autocommit is niet dezelfde autocommit die je in de database hebt - het is volledig onafhankelijk. Maar dit valt buiten het bestek van deze vraag.

Bewerkt op 22/01/2012

Hier is een "tweelingantwoord" op een vergelijkbare vraag.




  1. Snapshots van SQL Server-database -4

  2. Top back-uptools voor PostgreSQL

  3. Alle bovenliggende rijen in één SQL-query krijgen

  4. App Engine en MySQL