Ich benutze diesen Python-Code, um die Anzahl der Dinge alle 5 Sekunden auszugeben:
%Vor%Wenn ein anderer Prozess ein neues Thing generiert, während my_count () ausgeführt wird, druckt my_count () weiterhin die gleiche Nummer, obwohl sie sich in der Datenbank geändert hat. (Aber wenn ich my_count () töte und es neu starte, wird es die neue Thing-Zahl anzeigen.)
Die Dinge sind in einer MYSQL innodb-Datenbank gespeichert, und dieser Code läuft auf ubuntu.
Warum zeigt my_count () das neue Thing.objects.count () nicht an, ohne neu gestartet zu werden?
Da die Python-DB-API standardmäßig im AUTOCOMMIT = OFF-Modus und (mindestens für MySQLdb) auf der REPEATABLE READ-Isolationsebene ist. Dies bedeutet, dass hinter den Kulissen eine laufende Datenbanktransaktion (InnoDB ist eine transaktionale Engine) existiert, in der der erste Zugriff auf eine gegebene Zeile (oder vielleicht sogar eine Tabelle, ich bin nicht sicher) die "Ansicht" dieser Ressource für den verbleibenden Teil von die Transaktion.
Um dieses Verhalten zu verhindern, müssen Sie die aktuelle Transaktion aktualisieren:
%Vor%- Beachten Sie, dass transaction.autocommit ist Dekorator dient nur dazu, in den Transaktionsverwaltungsmodus zu gelangen (dies könnte auch manuell über die Funktionen transaction.enter_transaction_management / leave_transaction_managemen geschehen).
Noch eine Sache - um sich dessen bewusst zu sein - Djangos Autocommit ist nicht das gleiche Autocommit wie in der Datenbank - es ist völlig unabhängig. Aber das ist für diese Frage nicht möglich.
Hier ist eine "Zwillingsantwort" auf eine ähnliche Frage.