Weil die Python-DB-API standardmäßig im Modus AUTOCOMMIT=OFF und (zumindest für MySQLdb) auf der Isolationsstufe REPEATABLE READ ist. Dies bedeutet, dass Sie hinter den Kulissen eine laufende Datenbanktransaktion haben (InnoDB ist eine Transaktions-Engine), in der der erste Zugriff auf eine bestimmte Zeile (oder vielleicht sogar eine Tabelle, ich bin mir nicht sicher) die "Ansicht" dieser Ressource für den verbleibenden Teil von korrigiert die Transaktion.
Um dieses Verhalten zu verhindern, müssen Sie die aktuelle Transaktion „aktualisieren“:
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)
-- Beachten Sie, dass transaction.autocommit decorator dient nur zum Aufrufen des Transaktionsverwaltungsmodus (dies könnte auch manuell mit den Funktionen transaction.enter_transaction_management/leave_transaction_managemen erfolgen).
Eine weitere Sache - seien Sie sich bewusst - Djangos Autocommit ist nicht das gleiche Autocommit, das Sie in der Datenbank haben - es ist völlig unabhängig. Dies ist jedoch für diese Frage nicht zulässig.
Bearbeitet am 22.01.2012
Hier ist eine "Doppelantwort" auf eine ähnliche Frage.