Richtige Umgang mit Ausnahmen bei der Arbeit mit Datenbank
Wenn ich der Ausführung einer einfachen Abfrage (ich bin mit tornado.Datenbank Modul) ich handle Ausnahmen, wie diese:
try:
self.application.db.execute('DELETE FROM table_one WHERE a = 1')
except Exception, e:
logging.warning('DB exception: %s' % e)
self.set_status(500)
return
Wenn ich will, um eine Transaktion durchführen, obwohl, es wäre klug, um das rollback im Falle einer Ausnahme:
try:
self.application.db.execute('START TRANSACTION')
self.application.db.execute('DELETE FROM table_one WHERE a = 1')
self.application.db.execute('DELETE FROM table_two WHERE b = 2')
self.application.db.execute('COMMIT')
except Exception, e:
logging.warning('DB exception: %s' % e)
self.set_status(500)
self.application.db.execute('ROLLBACK')
return
Aber was ist, wenn rollback zu einer Ausnahme führen (z.B. wenn die Verbindung fehlschlägt)? Brauche ich um eine geschachtelte try-except-block in der außer-block?
- So starten Sie mit, nicht fangen die Allgemeine
Exception
. Stattdessen versuchen Sie zu fangen, was auch immer bestimmten-Fehler, den Sie bereit sind zu handhaben. Für rollback, wenn die Verbindung verloren geht (keine normalen) Datenbank-rollback automatisch. - tornado wirft Allgemeinen
Exception
. Ja, es wird, aber Standard -wait_timeout
für MySQL 28800 Sekunden, so dass andere Transaktionen auf diese Tabellen wären blockiert für die Dauer der Zeit, so brauche ich, um rollback explizit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Platzierung ein geschachteltes try ... except-block außer block ist eine Lösung.
Aber ich würde für die Verwendung schließlich:
Ich meine, wenn das rollback ist fehlgeschlagen, da ist so ziemlich nichts anderes zu tun, dann melden die Ausnahme und Aufräumen, richtig?
besser, zu prüfen, Empfehlungen von hier
gemäß PEP, wichtigsten Punkte, die ich hervorheben möchte, hier: