在多个请求期间防止 MongoDB 更新查询中的竞争条件
Prevent MongoDB race condition in update query during multiple requests
我在 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 运算符执行递减并读取完成的更新次数以查看计数是否开始为正数。
我在 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 运算符执行递减并读取完成的更新次数以查看计数是否开始为正数。