Безопасное списание с баланса пользователя
Условие задачи
Имеется таблица user, в которой хранится информация о балансе И есть функция на псевдокоде, которая выполняет списание: Определить, какие проблемы присутствуют в этом коде и как улучшить реализацию, учитывая что код используется в продакшене. Обратить внимание на конкурентность, атомарность, транзакции и возможные race condition.
gofunc withdrawBalance(user_id int32, amount float32) {
balance = exec('select balance from user u where u.id=$1', user_id)
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', user_id)
}
}