如何使用mongoengine避免竞争条件(对ListFields和DictFields进行原子更改)

时间:2013-07-16 20:52:00

标签: django mongodb pymongo mongoengine

我正在使用mongoengine,似乎遇到了一些潜在的竞争条件事件。作为一个简单的例子,我们的代码可以像这样工作

def changeModel(newitemL, olditemD)
    model.randomList.append(newitemL)
    model.randomDict.pop(olditemD,None)
    model.save()

因此,如果两个用户尝试使用不同的项目执行此操作,则有时只会显示1个用户对已保存模型的更改。有没有一种方法我想以原子方式更改ListFields和DictFields来避免这种情况?

1 个答案:

答案 0 :(得分:2)

不是进行保存,而是更好地进行更新,例如:

model.update(push__randomList=newitemL, pop__randomDict)

这样你只会原子地影响这些元素。

目前mongoengine在list / dict字段上保存时简单而天真,例如:

model.randomList.append(newitemL)

# Converts to a set of the whole list:
model.update(set__randomList=model.randomList)