Добавь в таблицу поле version.
Делай все в транзакции (уровень не ниже - Read committed):
1. При выборке строки из базы сохрани значение version у себя в программе.
2. При апдейте делай так:
Update ... set balance = balance - сумма покупки, version=version + 1 where version = сохраненное значение версии.
3. Если запрос проходит успешно, то количество измененных строк = 1, если ничего не менялось = 0.
Все это называется - optimistic locking