Sobes.tech
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 для обеспечения согласованности и отказоустойчивости.