如何使用python FastAPI正确扣除用户余额

问题描述 投票:0回答:1

我有一个 FastAPI 后端应用程序,其中提供多个 API,每个 API 都会花费用户 10 个积分。我只想在 api 调用成功(没有错误)时扣除用户余额,这是我的第一个 api 端点:

@router.post("/")
async def process_one(current_user = Depends(get_current_user),
                      db_session: Session = Depends(get_db_session)):
    try:
        if current_user.credits < 10:
            raise HTTPException(status_code=400, detail="Insufficient credits")
        current_user.credits -= 10
        db_session.flush()
        time.sleep(300) # some processing that will take 2-3 minutes
        
        db_session.commit() # no error so commit to database
        return {"status", "success"}
    except Exception as e:
        raise HTTPException(status_code=500, detail="Internal Server Error")

这工作正常,但是,该 api 需要 2-3 分钟才能完成处理。假设用户只有10个积分,他调用这个api,因为这个api需要2-3分钟,用户可以直接调用另一个api,该api将在1秒内完成处理,系统将允许,因为第一个api有还没有将扣款提交到数据库,怎么解决?

ChatGPT 建议锁定用户记录,但我认为这不是一个正确的解决方案,因为用户将无法调用任何其他 api(因为所有 api 都会扣除用户积分,因此他们会进行更新,但记录是已锁定)。

python sqlalchemy fastapi
1个回答
0
投票

已经有一段时间了,但我认为我的回应是合适的。

您可以使用乐观或悲观阻塞

© www.soinside.com 2019 - 2024. All rights reserved.