我在网络应用中使用pymongo,并希望做一些表格:
doc = collection.find(document)
doc.array1.append('foo')
for(y in doc.array2): <do things with y>
doc.array2 = filter(lambda x: ..., doc.array2)
doc.x = len(doc.array2)
collection.save(doc)
是否有任何简单的方法可以处理处理同一文档的多个请求,并防止一个人破坏另一个的结果/因为它正在编辑陈旧版本而无效?
答案 0 :(得分:4)
您可能感兴趣的部分是关于更新的部分,如果它仍然是最新的。
- 获取对象。
- 在本地修改对象。
- 发送更新请求,说明“如果对象仍然与其旧值匹配,则将对象更新为此新值”。
醇>如果操作失败,我们可能希望从第1步再试一次。
当您要执行许多操作并且希望避免对数据库进行锁定时,这是一种方法。他们还在该文件中说明他们如何反对持有锁。
答案 1 :(得分:0)
您可以在应用程序级别实现文档锁定。
使用场景:
with DocumentLock(doc_id):
# DocumentLock makes sure no other thread interferes
doc=db.doc_collection.find_one(doc_id)
... # analyse and update the document
db.doc_collection.save(doc)
我为多线程应用程序实现了DocumentLock类并将其发布为here。
此悲观锁定比official docs中建议的乐观锁定更容易使用。它在certain conditions下也更有效率(在其他情况下效率可能非常低,因此在使用它之前必须进行思考和评估)。