防止MongoDB在多个请求中出现update query的竞态



我在Flask中有一个简单的web应用程序,我使用Mongoengine作为ORM。API接收请求,将请求添加到工作队列,减少用户的许可证计数并将其保存回来。示例代码如下:

def process_request(body):
user = User.objects.get(username=username_from_session)
add_request_to_worker_queue(body['data'])

user.total_license_count = user.total_license_count - 1
user.save()

按预期工作。但是我注意到,当同一用户同时发送多个请求时,license_count不会像预期的那样减少。我想这是因为其他请求没有看到第一个请求的更新,因为它仍在处理。

我尝试添加一个随机延迟的请求,但它没有帮助。我不知道是否有某种形式的锁机制在MongoDB等待,直到其他进程完成处理。我如何解决这个问题,以防止这种情况的发生。

我的堆栈是Python, Flask, Mongoengine, MongoDB

使用条件更新,设置条件为license_count>0,使用$inc运算符执行自减操作,并读取已完成的更新次数,以查看计数开始时是否为正。

最新更新