Перевод между счетами: деньги списали, но не зачислили
Код перевода между счетами выглядит так (управление транзакциями не настроено, каждая операция сохраняется отдельно):
account_from.balance -= amount
account_from.save()
send_notification(account_from.user_id, amount) # здесь вылетело исключение
account_to.balance += amount
account_to.save()
После инцидента у части клиентов деньги списаны, но не зачислены. Что нужно изменить?
- Оба изменения и так попадают в общую транзакцию, данные целы — проблема в отчётности
- Достаточно обернуть вызов уведомления в try/except и продолжить выполнение дальше
- Поменять порядок: сначала зачислять получателю, потом списывать у отправителя
- Оба изменения счетов — одна транзакция, а уведомление отправлять после её коммита
