Dies ist, was mein Code wieWie Ausnahmen innerhalb Sellerie rückgängig zu machen, wenn sqlalchemy + postgresql mit
import transaction
@app.task(name='task_name')
def task_name_fn(*args, **kwargs):
with transaction.manager:
try:
actual_fn(*args, **kwargs)
transaction.commit()
except:
transaction.abort()
sieht jedoch meine transaction.abort()
scheint nicht zurück rollen werden. Alle nachfolgenden Sellerieaufgaben an diesem Arbeiter scheitern. Ich erhalte den folgenden Fehler
Die Transaktion dieser Sitzung wurde aufgrund einer vorherigen Ausnahme während des Flushvorgangs zurückgesetzt. Um eine neue Transaktion mit dieser Sitzung zu beginnen, geben Sie zuerst Session.rollback() aus.
Was mache ich falsch?
Bessere Frage noch, wie würden Sie die task_name_fn
schreiben, so dass dieses Problem nicht auftritt?
Sie, mein Freund, haben mich ein paar Stunden der Forschung gerettet! Vielen Dank –
Und Sie haben mich 10K SO Ruf erreicht, danke. Im Ernst, ich wünschte, jemand hätte mir das vor ein paar Jahren gesagt, anstatt es Stück für Stück zu lernen. Ich hoffe, dass andere Leute diese SO Frage + Antwort finden werden. –
Bitte beachten Sie, dass dies keine Transaktionswiederholungen beantwortet, wenn eine Konfliktlösung in der SQL-Datenbank vorliegt. Das Wiederholen ist Voraussetzung, wenn Sie eine effektive Transaktionsisolationsstufe in SQL verwenden, um Race-Bedingungen zu vermeiden. Siehe hierzu ein Beispiel für einen wiederholbaren Transaktions-Handler hier https://websauna.org/docs/api/websauna.system.model.retry.html?highlight=retryable#websauna.system.model.retry.retryable oder Sellerie-Task-Basisklasse Das kann sich erneut versuchen https://websauna.org/docs/api/websauna.system.task.tasks.html?highlight=retryable#websauna.system.task.tasks.RetryableTransactionTask –