Что сделать, если транзакции перезаписывают результаты друг-друга в Yii2:?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
hermaeus.seeker
Сообщения: 14
Зарегистрирован: 2022.02.11, 17:42

Что сделать, если транзакции перезаписывают результаты друг-друга в Yii2:?

Сообщение hermaeus.seeker »

Логика:
Баланс пользователя: $0.
Пользователь пополняет баланс на: $1000.
Есть ReplenishListener, который "слушает" все пополнения, и за определенные даёт бонус, в данном случае: $50.

Проблема: Зачисление платежа, бонус за платеж - обернуты в одну транзакцию. И перезаписывают друг-друга:

Код: Выделить всё

	Запрос №1: Добавляет к балансу $50. 
	Запрос №2: Всё ещё считает, что баланс пользователя $0, а не $50, и начисляет $1000. 
	Итог: баланс пользователя $1000, а не $1050. 
Изображение

Конечно, можно написать:

Код: Выделить всё

       Yii::$app->db->createCommand("UPDATE `user` SET `balance`= `balance` + :sum WHERE `id`=:uid")
            ->bindValue(":uid", $userId)
            ->bindValue(":sum", $sum)
            ->execute();

Но этот подход сохранит баланс "в обход" всех Событий и Поведений.
Баланс сейчас добавляется:
Изображение


Как поступить в данной ситуации?
hermaeus.seeker
Сообщения: 14
Зарегистрирован: 2022.02.11, 17:42

Re: Что сделать, если транзакции перезаписывают результаты друг-друга в Yii2:?

Сообщение hermaeus.seeker »

В общем, решилось тем, что сохранение баланса пользователя поставил выше сохранения платежа:

Код: Выделить всё

        $this->transactionManager->execute(function () use ($payment, $user) {
            $this->userRepository->save($user);
            $this->paymentRepository->paid($payment);
        });
Ответить