2010-06-21 11 views
8

J'ai une application Django qui utilise MySQL et le moteur InnoDB pour le stockage. Pour une raison quelconque, Django laisse parfois des verrous en place, même une fois la requête terminée. (Je peux les voir avec Innotop). La seule manipulation de transaction que je fais dans mon code est que django.db.transaction.commit_on_success est spécifié pour certaines de mes méthodes save() où je travaille avec l'héritage multi-tables.pourquoi django laisse-t-il des verrous dans mysql?

Si je redémarre le serveur Apache, les verrous disparaissent.

Est-ce que quelqu'un a déjà vu quelque chose comme ça? Aurais-je pu écrire dans un anti-pattern qui provoquerait cela?

Répondre

1

La seule fois où j'ai réussi à accomplir cela était de mettre en place des tâches "planifiées" dans Django qui n'étaient pas liées à des requêtes/vues. Le système de traitement des transactions de validation automatique par défaut ne valide les transactions que lorsqu'une paire demande/réponse est terminée et renvoyée à l'utilisateur final. La création de tâches kron-esque s'exécutant sans qu'une demande soit envoyée contourne ce mécanisme.

Sinon, il est généralement assez difficile de ne pas réussir à libérer un verrou. Vous êtes sûr qu'il n'y a pas de blocs de code extrêmement longs (en comptant peut-être sur un service externe qui expire ou quelque chose de ce genre) reliant les choses?