sql >> Databasteknik >  >> RDS >> Mysql

Varför visar inte denna loop ett uppdaterat objektantal var femte sekund?

Eftersom Python DB API är som standard i AUTOCOMMIT=OFF-läge, och (åtminstone för MySQLdb) på REPEATABLE READ-isoleringsnivå. Detta innebär att du bakom kulisserna har en pågående databastransaktion (InnoDB är transaktionsmotor) där den första åtkomsten till en given rad (eller kanske till och med tabell, jag är inte säker på) fixar "vy" av denna resurs för den återstående delen av transaktionen.

För att förhindra detta beteende måste du "uppdatera" aktuell 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)

-- Observera att transaction.autocommit decorator är endast till för att gå in i transaktionshanteringsläge (detta kan också göras manuellt med funktionerna transaktion.enter_transaction_management/leave_transaction_managemen).

En sak till - för att vara medveten om - Djangos autocommit är inte samma autocommit som du har i databasen - det är helt oberoende. Men det här är utanför räckvidden för denna fråga.

Redigerad 2012-01-22

Här är ett "tvillingsvar" på en liknande fråga.




  1. MIN() Funktion i PostgreSQL

  2. Kolumn 'id' där klausulen är tvetydig

  3. Hur man hämtar radvärden för en datagridview och skickar den till en annan form med en knapp i samma rad

  4. Hur får man snyggt formaterade resultat från en Oracle-procedur som returnerar en referensmarkör?