Есть такая упрощённая схема работы с деньгами:
1. MySQL: START TRANSACTION
Снимаем деньги с баланса пользователя
2. Работа с внешним API, совершаем перевод реальных денег
Если API возвращает ошибку — MySQL: ROLLBACK, иначе переходим к шагу 3
3. MySQL: COMMIT
В чём вопрос и проблема: если между шагами 2 и 3 после того как внешний API перечислил деньги, произойдёт сбой и например, упадёт БД, то в нашей системе деньги не засчитаются как списанные и операцию можно будет повторить, хотя по факту перевод был.
Как избегают подобные ситуации?