在多个请求期间防止更新查询中的 MongoDB 竞争条件

问题描述

我在 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 运算符执行递减并读取完成的更新次数,以查看计数是否开始为正数。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...