Всем привет.
Кратко опишу проблему, т.к. хочу сам разобраться и понять. Если что - скину фрагменты кода.
Есть сайт. На нем есть покупка товара (чего - не важно).
Есть контролер, в нем метод buyProduct(). Там все по дефолту, сначала идут разные проверки (хватает ли баланса, есть ли еще товар, не заблочен ли юзер и т.п.).
Если все проверки проходят, идет try catch блок с beginTransaction, commit-ом в случае успеха ну и rollback в случае ошибки.
Всего идут 3 sql запроса (через конструктор запросов Laravel).
1 - Занесение инфы в таблицу buyHistory.
2 - Занесение инфы в таблицу historyPayment (история оплат, не так важно зачем мне она, просто говорю все как есть).
3 - Уменьшение баланса юзера на цену товара.
Проблема с третим пунктом. Раньше я обновлял баланс так:
$user->balance -= $price;
$user->saveOrFail().
Но была проблема с тем, что когда очень быстро отсылаешь запросы на покупку (у сайта есть API, через него можно покупать). То бывал часто баг, когда баланс еще не успевал минуснуться, уже шел новый запрос. Сайт думал что баланса хватало и выдавал еще один товар (хотя по факту денег уже не хватало, не успевал пройти запрос).
Я пофиксил это легко - сделал так:
$user->dispatch('balance', $price);
И все стало просто круто, все работало. Но сейчас проблема появилась опять.
(довольно много юзеров на сайте, а не давно еще вырос онлайн). Просто если раньше словить баг было очень легко и наабузить себе баланс. То сейчас чуть сложнее, нужно еще быстрее обновлять страницу и где-то 1 попытка из 3 сработает.
Я вывел лог, проблема таже - не успевает минуснуться баланс.
Мне нужна подсказка: как правильно построить эту систему покупки, чтобы все было хорошо?