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

Логика:

  • Баланс пользователя: $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();

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

Добавление баланса

Как поступить в данной ситуации?


Ответы (0 шт):