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