В FastAPI два запроса одновременно меняют баланс одного счёта. Объясни, почему `await` между чтением и записью всё ещё создаёт гонку и какая операция изменения баланса должна быть атомарной.

await может передать управление другой задаче между чтением и записью. Оба запроса прочитают прежний баланс, а затем один результат затрёт другой; атомарной должна быть вся проверка и изменение состояния.

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

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

await может передать управление другой задаче между чтением и записью. Оба запроса прочитают прежний баланс, а затем один результат затрёт другой; атомарной должна быть вся проверка и изменение состояния.

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

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

await может передать управление другой задаче между чтением и записью. Оба запроса прочитают прежний баланс, а затем один результат затрёт другой; атомарной должна быть вся проверка и изменение состояния.

Для списания важен единый шаг «если денег достаточно, уменьшить баланс». В БД это реализуют условным UPDATE либо транзакцией с подходящей блокировкой. Простое balance = old_balance - amount после await не защищено тем, что код находится в одной coroutine. asyncio.Lock может помочь только внутри одного процесса и loop, но не координирует несколько workers. Повтор одной операции отдельно контролируют идемпотентностью.

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

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

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

Подробнее