I am using Django0.96/apache2/mod_python(running prefork MPM) / mysql,
for my Django project, a typical Django environment, I think. And
usually there're more than 10 apache2 processes running on my site, as
the online users is about 100+.

I found a problem that sometimes if one user clicks a link several
times very fast (means several identical requests are sent to the
server), some error will happen. Although in my codes, I am tring to
prevent such thing. Let me make a simple example to illustrate my
problem.

#models.py
class Apple_For_Sale(models.Model):
        price = models.PositiveSmallIntegerField()
        has_been_sold = models.BooleanField(default=False)

class People(models.Model):
        money = models.PositiveSmallIntegerField()

        def buy_apple(self,apple): #apple should be an instance of
Apple_For_Sale
                if self.money >= apple.price and not apple.has_been_sold:
                        self.money -= apple.price
                        self.save()
                        apple.has_been_sold = True
                        apple.save()
 
Sale_Records.objects.create(apple=apple,people=self)

class Sale_Records(models.Model): #create one record when one people
buy
    apple = models.ForeignKey(Apple_For_Sale)
    people = models.ForeignKey(People)
    dealt_date = models.DateTimeField(auto_now_add=True)


#views.py
def people_buy_apple(request,aid):
        "aid is the id of an apple_for_sale
        a = get_object_or_404(Apple_For_Sale, pk=aid)
        p = People.object.get(xxx) #....get people...omitted here
        p.buy_apple(a)
        return ....

The logic is simple. If the people has enough money and the apples
have not already been sold, then the "buy apple" will be successful.

And in my site, I think 99% of such things happened correctly. But,
very rarely, when one user clicks a link of "buy apple" several times
fast, there'll be more than 1 records of Sale_Records created, for
same "apple" and "people", and the people's money was minused several
times for one identical apple. And if the network is laggy, it seems
the frequency of such error occurs becomes higher.

For my understanding, when the several "identical requests" are sent
to my server, the requests are dispatched to different apache2
processes, and nearly the same time, each process "think" the "buy
apple" can happen successfully. so....the error comes out.

In my actual site,  I have added some "unqiue = True" to avoid this
kind of error, in DB level. For example:
class Sale_Records(models.Model):
    apple = models.ForeignKey(Apple_For_Sale, unique=True)

But really I doubt this is the right way to solve my problem.

Can anyone help? Can I avoid such error by using "mod_wsgi in daemon
mode with only 1
thread " (ref. to :
http://groups.google.com/group/django-users/browse_thread/thread/5bd598dbdeebf326/8c9183f37a9ba0ef?lnk=gst&q=thread+safe+mpm#8c9183f37a9ba0ef)

Thanks a lot!
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to