Логика:
Баланс пользователя: $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();
Но этот подход сохранит баланс "в обход" всех Событий и Поведений. Баланс сейчас добавляется так:
Как поступить в данной ситуации?