Back to questions
СБЕР
Middle+
3
Как обеспечить целостность транзакции перевода денег между банками, чтобы деньги не потерялись и не задвоились?
Companies where asked
Answer from AI
sobes.tech AI
Для обеспечения целостности транзакции перевода денег между банками необходимо использовать распределённые транзакции с механизмом двухфазного коммита (2PC). Это гарантирует, что обе операции — списание с одного счёта и зачисление на другой — выполнятся атомарно: либо обе, либо ни одной.
Основные подходы:
- Двухфазный коммит (2PC): координатор транзакции сначала запрашивает у всех участников готовность к коммиту, и если все готовы, то подтверждает коммит. Если кто-то не готов — откатывает.
- Идемпотентность операций: чтобы избежать задвоения, операции должны быть идемпотентными, например, использовать уникальные идентификаторы транзакций.
- Логирование и компенсационные транзакции: в случае сбоев можно откатить или компенсировать изменения.
Пример упрощённого алгоритма:
1. Создаётся уникальный ID транзакции.
2. Списываем деньги с отправителя, помечая операцию как "pending" с этим ID.
3. Отправляем запрос банку получателя на зачисление с тем же ID.
4. Если зачисление прошло успешно, фиксируем списание и зачисление.
5. Если что-то пошло не так, откатываем списание.
В реальных системах часто используют специализированные протоколы и middleware для обеспечения согласованности и отказоустойчивости.