Sobes.tech
Junior — Senior
74

Корректное списание средств с пользовательского баланса

Companies where asked:

Lamoda Tech
Task condition

В системе есть таблица user, где хранится текущий остаток средств каждого пользователя. Представлена функция на псевдокоде, реализующая процесс снятия суммы с баланса. Необходимо проанализировать её, выявить проблемные места и предложить улучшения, учитывая, что код работает в продакшене. Особое внимание следует уделить вопросам конкурентного доступа, атомарности операций, использованию транзакций и возможным гонкам данных (race conditions).

func withdrawBalance(userID int32, amount float32) {
    balance = exec('select balance from user u where u.id=$1', userID)
    if balance - amount >= 0.0 {
        exec('update user u set balance=balance-$1', amount)
        return exec('select balance from user u where u.id=$1', userID)
    }
}