sql >> Base de Datos >  >> RDS >> Mysql

Vuelva a intentar en interbloqueo para MySQL / SQLAlchemy

Realmente no puedes hacer eso con la Session desde fuera. Session Tendría que apoyar esto internamente. Implicaría ahorrar una gran cantidad de estado privado, por lo que es posible que no valga la pena.

Abandoné por completo la mayoría de las cosas de ORM a favor de la interfaz SQLAlchemy Core de nivel inferior. Usando eso (o incluso cualquier interfaz dbapi) puede usar trivialmente su retry_on_deadlock_decorator decorador (vea la pregunta anterior) para hacer un db.execute con reconocimiento de reintento envoltorio.

 @retry_on_deadlock_decorator
 def deadlock_safe_execute(db, stmt, *args, **kw):
     return db.execute(stmt, *args, **kw)

Y en lugar de

 db.execute("UPDATE users SET active=0")

lo haces

 deadlock_safe_execute(db, "UPDATE users SET active=0")

que volverá a intentarlo automáticamente si ocurre un interbloqueo.