Naprawdę nie możesz tego zrobić z Session
z zewnątrz. Session
musiałby wspierać to wewnętrznie. Wymagałoby to zaoszczędzenia dużej ilości prywatnego państwa, więc może to nie być warte twojego czasu.
Całkowicie porzuciłem większość rzeczy związanych z ORM-em na rzecz interfejsu SQLAlchemy Core niższego poziomu. Używając tego (lub nawet dowolnego interfejsu dbapi) możesz banalnie użyć swojego retry_on_deadlock_decorator
dekorator (patrz pytanie powyżej), aby umożliwić ponowne próby db.execute
opakowanie.
@retry_on_deadlock_decorator
def deadlock_safe_execute(db, stmt, *args, **kw):
return db.execute(stmt, *args, **kw)
I zamiast
db.execute("UPDATE users SET active=0")
tak
deadlock_safe_execute(db, "UPDATE users SET active=0")
który spróbuje automatycznie ponowić próbę, jeśli nastąpi zakleszczenie.