I am using transaction, but still have the problem. ;(

You are right, my problem is from "concurrent requests", which I have
searched in this group, but haven't found a very good solution...

On 7月2日, 上午1时45分, phillc <[EMAIL PROTECTED]> wrote:
> i think you need transactions?
>
> problem being that if all those processes happen at about the same
> time, they will all see enough money, then they will all process it.
>
> On Jul 1, 5:12 am, pength <[EMAIL PROTECTED]> wrote:
>
>
>
> > sorry for the bad indent of the "#models.py" part. I post it again,
> > hope this time that part will be shown OK.
>
> > #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)
>
> > On Jul 1, 4:53 pm, pength <[EMAIL PROTECTED]> wrote:
>
> > > 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/5bd5...)
>
> > > 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