2

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

有没有什么简单的方法可以处理处理同一个文档的多个请求,并防止一个请求破坏另一个的结果/因为它正在编辑一个过时的版本而使其无效?

4

2 回答 2

6

查看 mongodb 文档中关于原子操作的部分

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

  1. 获取对象。
  2. 在本地修改对象。
  3. 发送一个更新请求,上面写着“如果对象仍匹配其旧值,则将其更新为此新值”。

如果操作失败,我们可能想从步骤 1 重试。

当您有许多操作要执行并且您希望避免在数据库上持有锁时,这是一种方法。他们还在该文档中说明了他们通常如何反对持有锁。

于 2012-07-16T00:24:56.780 回答
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 类并在此处发布。

这种悲观锁定比官方文档中建议的乐观锁定更容易使用。它在某些条件下也更有效(在其他条件下可能效率非常低,因此您必须在使用之前思考和评估)。

于 2013-11-23T19:08:46.447 回答