2016-04-03 8 views
0

Ich benutze SQLAlchemy für meine Web-App.sqlalchemy: ist Rollback bei jedem Commit erforderlich?

try: 
    session.commit() 
except: 
    session.rollback() 

ich mich, wenn es für jeden commit() Betrieb notwendig ist: Ich habe eine Menge Code so gesehen. Wenn ja, warum gehört es dann nicht zur commit() Operation? Wie zu entscheiden, wann zu rollback() und wann nicht?

+0

Wenn Sie diese Art von Boilerplate viel schreiben, brechen Sie es in eine Funktion. PS: Du solltest nicht "except", sondern "außer exception" machen: "da das bloße" except "Dinge fangen kann, die du normalerweise nicht fangen willst. – kindall

Antwort

1

Wenn das Festschreiben fehlschlägt, bedeutet dies nur, dass die Transaktion nicht abgeschlossen werden kann, ohne einige Einschränkungen zu durchbrechen. Im Prinzip können Sie also, anstatt sich zurück zu bewegen, einige Aktualisierungen vornehmen und versuchen, erneut zu committen.

In der Praxis ist eine solche Fehlerbehebungslogik nicht trivial, weshalb die meisten Benutzer nur einen Rollback durchführen (alle für die Transaktion vorgenommenen Änderungen rückgängig machen), um die Daten konsistent zu halten und das Problem dem Benutzer mitzuteilen.

+0

danke. Im Anschluss an die Frage: Wie mache ich den 'commit()' Aufruf zum Testen des Rollbacks fehlgeschlagen? – lang2

+1

Sie möchten einige Einschränkungen verletzen. Wahrscheinlich ist es am einfachsten, den Primärschlüssel der modifizierten Zeile so zu ändern, dass er entweder nicht eindeutig (für INSERT) oder nicht vorhanden (für UPDATE) wird. – szym

Verwandte Themen