Aktualisieren von transaction.commit_manual () zu Django 1.6

8

Ich habe Code für eine App geerbt, die für Django 1.4 geschrieben wurde. Wir müssen die Codebasis aktualisieren, um mit Django 1.7 und schließlich 1.8 als nächste Long Term Support-Version zu arbeiten.

An einigen Stellen verwendet es den alten Stil @transaction.commit_manually und with transaction.commit_manually:

Ich weiß nicht genug über Transaktionen im Allgemeinen, aber ich versuche zu verstehen, wofür sie verwendet werden, also kann ich sie entweder entfernen (wenn nicht unnötig) oder sie auf die neuere set_autocommit(False) oder gleichwertig aktualisieren.

Ich habe verstanden, dass das Transaktionsmanagement in Django & lt; 1.5 war nicht ideal und für die meisten Anwendungsfälle zu kompliziert.

Die Datenbankverbindung sieht so aus, ohne spezielle Transaktionsverwaltung. (Mit Postgres 9.3)

%Vor%

Es gibt keine spezielle Transaktions-Middleware.

Ich finde die folgende Ansicht besonders rätselhaft. (Bearbeitet)

%Vor%

Dabei ist initialize_xml_model eine Funktion, die eine flache XML-Datei (XML-Modellvorlage) verwendet und ein neues XMLModel-Objekt erstellt. Und insert_user_info fügt Informationen, die im Benutzerobjekt gespeichert sind, in das XML-Modell ein.

Die Art, wie ich diesen Code lese, ist

  1. Wir deaktivieren autocommit mit commit_manually
    • Wir erhalten entweder das neueste XMLModel-Objekt für den Benutzer oder
    • initialisiert ein neues XMLModel-Objekt
  2. transaction.commit() speichert dies in der Datenbank, wenn keine Fehler vorliegen.
  3. Wir überprüfen, ob unsere model eine Unicode-Instanz ist und kodiere sie dann (ich bin mir nicht sicher, was genau das tut)
  4. Wir öffnen eine neue Transaktion
  5. Instanziieren Sie ein XMLManipulator-Objekt mit model
  6. Fügen Sie Zeug ein und bereinigen Sie xml
  7. Weisen Sie die XML-Instanz als% string model zu ( tostring ist eine XMLManipulator-Methode, die Stylesheet-Deklarationen beibehält.)
  8. lösche das xml -Objekt
  9. Commit-Transaktion

Nach 5. ist die einzige Sache, die sich mit der db (in einem Lesevorgang) beschäftigt, die Methode insert_user_info.

Ich verstehe nicht wirklich, warum das in einer speziellen Transaktion passiert. Es gibt kein Schreiben an die db?

Es gibt keine anderen Methoden in dieser Ansicht, nur get.

Ich habe hier etwas Wichtiges verpasst, zögern Sie nicht, Fragen zu stellen oder weitere Informationen zu erhalten.

Ist die Transaktion hier wirklich notwendig, und wenn ja, wie könnte dies für das neue transaction.set_autocommit neu geschrieben werden?

Jede Hilfe oder Hinweise würden sehr geschätzt werden.

    
seb 19.03.2015, 16:13
quelle

1 Antwort

6

Ein guter Weg, dies jetzt zu tun, ist transaction.atomic. In Ihrem Beispiel würde ich tun:

%Vor%     
hugotacito 03.07.2015 19:28
quelle