2010-11-05 4 views
1

Est-ce que quelqu'un sait comment lire/écrire un Booleanfield atomique dans Django? J'essaie de faire ce qui suit:Django atomic boolean

J'ai un champ dans un modèle appelé email_sent. Chaque fois que je reçois une notification de paiement instantanée (IPN) de notre processeur de paiement, je veux envoyer un e-mail de notification. Comme je reçois plusieurs notifications, et que je veux juste envoyer un e-mail de reçu, je (pour l'instant) utilise simplement une vérification dans le modèle si un e-mail de reçu a déjà été envoyé ou non. Parfois, cependant, je reçois plusieurs IPN en même temps pour le même utilisateur. Je ne veux pas envoyé plusieurs e-mails, mais le code suivant présente une condition de course:

if purchase.email_sent: 
    self.send_email() 
    purchase.email_sent = True 
purchase.save() 

Ceci est clairement pas la bonne approche, mais comment voulez-vous mettre en œuvre une lecture/écriture atomique sur un champ booléen (postgresql)? Je sais qu'il ya 2 approches pour résoudre ce: 1) utiliser un compteur et faire une mise à jour() 2) utiliser une opération memcached atomique

deux 1 et 2 semblent hacks laid qui ne devrait pas être nécessaire. Des pensées et/ou je manque quelque chose d'évident?

Merci!

Répondre

0

N'envoyez pas de notifications instantanément. Mettre en file d'attente toutes les notifications et les envoyer en utilisant un processus d'arrière-plan.

+0

Pas mal, mais c'est une solution de contournement et ne répond pas directement à la question. Je me demande aussi si cette fonctionnalité existe, bien que je ne suis pas sûr que le concept d'une variable "atomique" soit applicable dans un langage interprété. – jMyles

+0

@Justin Myles Holmes: toute autre solution impliquerait une sorte de verrou partagé, potentiellement dangereux et moins élégant que mon conseil. Si quelque chose semble trop dur dans Django, vous êtes probablement dans le mauvais chemin. –

+0

Bonne idée Paulo, merci! Je me demande quand même: il est possible d'incrémenter atomiquement un compteur dans la base de données, alors pourquoi ne pas lire/basculer un booléen? Cela ne semble pas être un cas d'utilisation très ésotérique. – Dick