Anton
Надо лочить баланс
Artem
Надо лочить баланс
завести новое поле в бд у юзера?
Anton
просто ты не можешь просто так залочить, а только в транзакции
Anton
как БД?
Artem
как БД?
какая?
Anton
Это я у тебя спросил - какая у тебя БД
Artem
mysql
­
Подскажите регулярное выражение что бы вырезать номер моб. телефона с текста
Grigorii K.
Если я правильно понял, как работает (а почти не понял), то достаточно засунуть все запросы в транзакцию. Покупка произошла тогда и только тогда, когда выполнились все 3 или 4 запроса. Если, пока они выполняются, другая транзакция полностью выполнилась, и получилось, что закончить запросы в этой транзакции нельзя - транзакция отменяется и всё хорошо
Anton
траннакция позволяет только выполнить все или ни одного запроса
Artem
if ($user->bonus - $price * $count < 0) return response(['error' => 'Недостаточно бонусов на балансе'], 403);
Artem
у меня же это пропускает
Grigorii K.
траннакция позволяет только выполнить все или ни одного запроса
Ну и я об этом же. (вообще у транзакций больше 1 режима работы обычно, вроде минимум 4 знаю)
Artem
и потом в конце я делаю $user->bonus -= $price * $count
Anton
Ну и я об этом же. (вообще у транзакций больше 1 режима работы обычно, вроде минимум 4 знаю)
Я про суть, а тут надо именно баланс залочить, то есть пока идет процесс покупки, чтобы никто друголй (никакой другой запрос) не мог работать с балансом
Anton
и потом в конце я делаю $user->bonus -= $price * $count
Смотри у тебя приходят 2 запроса одновременно и оба выбрали пока баланс не отнят, и у обоих пройдет такое
Grigorii K.
Балланс же тоже обновляется запросом
Artem
а как лочить?
Anton
ларавель?
Artem
да
Anton
примерно так
Artem
?
Anton
DB::transaction(function() use ...{ $Balanse = BalanseModel::lockForUpdate()->find(ID); write here action })
Anton
ну или как ты транзакции используешь
Artem
не использую транзакции
Artem
зачем оно там
Grigorii K.
Они как раз для этого там
Grigorii K.
Чтобы весь процесс покупки был "одной операцией", а не кучей маленьких, которые могут выполняться вперемешку от разных запросов
Anton
зачем оно там
как правильно сказали выше - процесс покупки это несколько запросов и если один не прошел - остальные должны откатиться
Artem
lockForUpdate - новое поле у юзера завести?
Anton
Это функция такая у модели есть
Artem
ух ты ж
Artem
а после транзакции работает да?
Anton
а после транзакции работает да?
Смотря как ты напишешь :)
Artem
???
Anton
Это была попытка на шутку
Anton
я не совсем понял твой вопрос
Artem
лок спадает
Anton
что значит - после транзакции работает...
Artem
имею ввиду
Grigorii K.
Вообще, если никогда не использовал транзакции, то может быть хорошо ещё прочитать, что такое транзакции в бД
Artem
я знаю что это
Anton
лок спадает
теоретиески если ты лок берешь внутри транзакции, то при коммите или ролбеке - он спадает
Artem
а у меня $user из $request->user()
Artem
как я его залочу
Artem
и этот объект отправляю в сервис
Anton
$user = User->lockForUpdate()->find($user->id);
Anton
вот так :)
Grigorii K.
"Как говорили в универе + где-то писали, юзайте транзакции всегда, если есть связные друг с другом хоть как-то запросы, а то однажды в случайный момент произойдёт какая-то неведомая хрень"
Grigorii K.
Anton
я правда сейчас не повторю условий... плюс там очень специфически все было
Grigorii K.
Ты не поверишь... тут разок понадобилось юзать даже когда 1 запрос был...
Я постеснялся написать "используйте всегда"
Anton
Ну и lock когда работаете с деньгами (любой валютой за которую что-то можно купить)
Anton
Я вот как раз сейчас пишу заявку на хайлоад сибирь - примерно пока - типичные ошибки при работе с деньгами (правда со стороны не когда ты принимаешь, а когда выдаешь)
Anton
и случай двойных выплат и прочего - там будет конечно :)
Artem
а как мне return в транзакции сделать?
Grigorii K.
Возможно, тебе надо DB::rollback();
Grigorii K.
Если я понял, что ты хочешь
Anton
Anton
потому как в Ларавеле 2 способа сделать транзакцию
Artem
можно в личку?
Grigorii K.
Либо исключение кинуть*
Anton
при замыкании лучше исключение - тогда ролбэк точно будет
Anonymous
Может кто подкажет или видел, веб морду для управления рассылками для очереди?
SarcasmIO
Trekov
Есть на примете документация 5.6 в pdf?
Trekov
нашел только 5.5
Anonymous
Немного юмора 😂
Trekov
В Google Play нашел приложение с документацией
Andriy
ky всем
Andriy
Подскажите плс, почему это не работает:
Andriy
Andriy
ResourceCollection