Назад к вопросам
Ozon Финтех
Middle+
5
/** * Реализовать перевод средств между двумя счетами. Учитываем, что это production решение * Входные параметры: * @param fromAccountId уникальный идентификатор пользователя который переводит средства * @param toAccountId уникальный идентификатор пользователя кому переводят средства * @param amount сумма перевода. Положительное число */ public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) { }
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Для реализации безопасного перевода средств между счетами в production нужно учитывать:
- Проверку наличия средств на счете отправителя
- Атомарность операции (транзакция)
- Обработку ошибок
- Логирование и возможное уведомление
Пример реализации на Java с использованием транзакций:
public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) {
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
throw new IllegalArgumentException("Сумма перевода должна быть положительной");
}
// Начинаем транзакцию
transactionTemplate.execute(status -> {
Account fromAccount = accountRepository.findById(fromAccountId)
.orElseThrow(() -> new IllegalArgumentException("Отправитель не найден"));
Account toAccount = accountRepository.findById(toAccountId)
.orElseThrow(() -> new IllegalArgumentException("Получатель не найден"));
if (fromAccount.getBalance().compareTo(amount) < 0) {
throw new IllegalStateException("Недостаточно средств на счете отправителя");
}
fromAccount.setBalance(fromAccount.getBalance().subtract(amount));
toAccount.setBalance(toAccount.getBalance().add(amount));
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
// Можно добавить логирование операции
return null;
});
}
Такой подход гарантирует, что либо оба баланса обновятся, либо при ошибке изменения не будут сохранены. Важно использовать транзакции и проверять входные данные.