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