On 20-8-2012 19:37, Thomas Orozco wrote:

> Circumvent the problem with smarter design: don't store the money on the
> object, make the user's money the sum of all their transactions (credit -
> debit).
> You get lesser performance, but you also get history!

This does not circumvent the problem but aggravates it. The problem is
how to determine if a withdrawal is allowed before doing the withdrawal.
Not having the current balance available but instead having to do
complex queries on a possibly huge set of rows, increases the chances of
transactions being OK'd that should not be when multiple withdrawals are
sent in parallel.

Alexis has mentioned some options, but the real safeguard is to make
current balance field a positive decimal field and propagate this to the
database layer by ensuring a constraint is created. Even if two
transactions in parallel are working with the same initial balance, the
constraint will deny at least one of them. This is also why you should
enclose the entire process (add withdrawal to statement, decrease the
balance) in a single transaction. Possibly the
@transaction.commit_on_success decorator may prove useful.

-- 
Melvyn Sopacua

-- 
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 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to