2009-09-20 8 views
10

J'ai un projet django dans lequel les valeurs de base de données doivent être mises à jour assez souvent par elles-mêmes. Un cronjob est exécuté pour mettre à jour ces valeurs dans la base de données, mais certaines opérations nécessitent des transactions atomiques. Est-ce que quelqu'un sait comment faire une méthode de modèle être une transaction complète dans django sans passer par les vues?Gestion des transactions Django

Idéalement, j'aimerais pouvoir commencer une transaction au début d'une méthode et la valider à la fin, puis pouvoir simplement appeler cette méthode de n'importe où (une vue ou un cronjob) avec le garantir que la méthode est atomique. Si vous savez comment faire cela, je dois également savoir si, en cas d'échec de la validation (en raison d'une écriture simultanée ou autre), la transaction est automatiquement réessayée ou si je devais manuellement attraper une exception de panne et rappeler la méthode.

Merci.

Répondre

15

Avez-vous jeté un œil à Django transaction docs? Surtout le décorateur @transaction.commit_on_success (source code). Il valide la transaction si la fonction décorée renvoie sans déclencher une exception. Si une exception se produit, cela entraîne une annulation.

+5

Oui, c'est la bonne chose à utiliser. Je pense que le PO était préoccupé parce que la documentation ne fait référence qu'à ces points de vue, pas à des méthodes modèles, mais en regardant la source, il n'y a rien là qui ne fonctionnerait pas en dehors d'une vue. –

+5

Il y a en fait une note sur cette page de la documentation qui dit: "Bien que les exemples ci-dessous utilisent des fonctions de vue comme exemples, ces décorateurs peuvent aussi être appliqués aux fonctions sans vue." –

+0

Merci. Avez-vous une idée de ce qui se passe si des écritures simultanées sont tentées? La transaction réessaie-t-elle, et si non, qu'est-ce qu'elle lance? Merci! – So8res