Sobes.tech
Назад к вопросам
Middle+
5

/** * Реализовать перевод средств между двумя счетами. Учитываем, что это production решение * Входные параметры: * @param fromAccountId уникальный идентификатор пользователя который переводит средства * @param toAccountId уникальный идентификатор пользователя кому переводят средства * @param amount сумма перевода. Положительное число */ public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) { }

Компании, где спрашивали
Ozon ФинтехOzon Финтех

Ответ от нейросети

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;
    });
}

Такой подход гарантирует, что либо оба баланса обновятся, либо при ошибке изменения не будут сохранены. Важно использовать транзакции и проверять входные данные.