Корзина заблокирована навсегда
Чтобы два запроса одного покупателя не меняли корзину одновременно, её блокируют
на время изменения: with locked_cart(cart_id): .... Если внутри блока случилась ошибка,
корзина остаётся заблокированной, и все следующие запросы получают «корзина заблокирована».
Исправьте locked_cart так, чтобы блокировка снималась при любом исходе,
а ошибка из блока по-прежнему доходила до вызывающего кода.
Подсказка 1 из 2
Ошибка блока with выбрасывается внутри генератора — в строке yield.
Подсказка 2 из 2
Оберните yield в try/finally и снимайте блокировку в finally.