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 -~----------~----~----~----~------~----~------~--~---