Mysql
 sql >> Base de données >  >> RDS >> Mysql

Réessayer en cas d'interblocage pour MySQL / SQLAlchemy

Vous ne pouvez pas vraiment faire cela avec la Session de l'exterieur. Session devrait soutenir cela en interne. Cela impliquerait d'économiser beaucoup d'état privé, donc cela ne vaut peut-être pas la peine.

J'ai complètement abandonné la plupart des éléments ORM au profit de l'interface SQLAlchemy Core de niveau inférieur. En utilisant cela (ou même n'importe quelle interface dbapi), vous pouvez utiliser trivialement votre retry_on_deadlock_decorator décorateur (voir la question ci-dessus) pour créer un db.execute sensible aux nouvelles tentatives emballage.

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

Et au lieu de

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

vous faites

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

qui réessayera automatiquement si un blocage se produit.