在MongoDB中锁定文档

时间:2012-07-16 00:15:28

标签: mongodb pymongo

我在网络应用中使用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)

是否有任何简单的方法可以处理处理同一文档的多个请求,并防止一个人破坏另一个的结果/因为它正在编辑陈旧版本而无效?

2 个答案:

答案 0 :(得分:4)

请查看Atomic Operations

上mongodb文档中的部分

您可能感兴趣的部分是关于更新的部分,如果它仍然是最新的。

  
      
  1. 获取对象。
  2.   
  3. 在本地修改对象。
  4.   
  5. 发送更新请求,说明“如果对象仍然与其旧值匹配,则将对象更新为此新值”。
  6.         

    如果操作失败,我们可能希望从第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下也更有效率(在其他情况下效率可能非常低,因此在使用它之前必须进行思考和评估)。