Проблема гонки данных при списании баланса: как исправить?

Списание нужно сделать атомарным: проверка достаточности и уменьшение баланса должны выполняться согласованно, а повтор операции — защищаться ключом идемпотентности.

Короткий ответ

Что ответить на собеседовании

Списание нужно сделать атомарным: проверка достаточности и уменьшение баланса должны выполняться согласованно, а повтор операции — защищаться ключом идемпотентности.

Подробный разбор

Ответ с пояснениями

Списание нужно сделать атомарным: проверка достаточности и уменьшение баланса должны выполняться согласованно, а повтор операции — защищаться ключом идемпотентности.

Для одной строки подходит условный UPDATE balance = balance - :amount WHERE id = :id AND balance >= :amount с проверкой числа изменённых строк и положительности суммы. Перевод между счетами выполняют в транзакции с единым порядком блокировок. Mutex приложения не защищает от другой реплики сервиса. Денежные значения храните точно, а результат операции фиксируйте в журнале.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее