锁定在MongoDB中的文档(Locking a document in MongoDB)

2019-09-19 12:52发布

我使用的Web应用程序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)

有没有简单的方法,这样我就可以处理多个请求处理同一文档,并阻止人们重挫的另一个结果/因为它的编辑陈旧版本可为无效?

Answer 1:

看看在MongoDB的文档的部分原子操作

这可能是你的兴趣的部分是关于更新,如果它仍然是当前的部分。

  1. 获取的对象。
  2. 在本地修改的对象。
  3. 发送,上面写着“更新对象到这个新的值,如果它仍然符合其旧值”的更新请求。

如果操作失败,我们可能再需要从第1步重试。

这是当你有一些操作来执行,并要避免持有的数据库的锁的方法。 他们在该文档还说明他们一般是如何对持有锁定。



Answer 2:

您可以实现应用程序级别的文件锁。

使用场景:

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类的多线程应用程序,并将其发布在这里 。

这种悲观锁定更容易比劝乐观锁使用官方的文档 。 这也是下更高效的特定条件下 (而且可能是在别人非常低效的,所以你必须去思考和使用它之前评估)。



文章来源: Locking a document in MongoDB