我有一个 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 都会扣除用户积分,因此他们会进行更新,但记录是已锁定)。
已经有一段时间了,但我认为我的回应是合适的。
您可以使用乐观或悲观阻塞