MongoDB原子性问题 - 修改内存中的文档

Ste*_*tto 5 python atomicity mongodb

我正在使用MongoDB处理当前项目,并对构建对并发修改的支持的正确方法感到困惑.

我有一个对象数组.当请求进来时,我想检查该数组中的最后一个元素,并就如何响应做出条件决定.我的代码如下所示:

# Find the last object ID in the array.
last_element_id = str(document['objects'][-1])
if last_element_id != the_element_id_the_request_is_responding_to:
    db.documents.insert({
        ...
    })
else:
    # Append the response to the end of the array.
    document['objects'].append(new_element_id)
    db.documents.save(document)
Run Code Online (Sandbox Code Playgroud)

我关注的情况是:

  1. 在处理请求A时,我发现last_element_id是有效的,并且响应应该附加到列表的末尾.
  2. 在append()和save()操作完成之前,处理另一个请求B.
  3. B也看到last_element_id有效,追加()响应和save().
  4. 现在,A的响应被排列到数组的末尾,但是响应不再跟随假设的'last_element_id',因为B的响应事先就被偷走了.

在Mongo的原子模型中处理这种逻辑的正确方法是什么?如果可以避免使用锁,我不想使用锁,因为WSGI应用程序可以同时在多个进程中运行.

谢谢!

小智 1

您可以使用乐观锁定..,一种方法是在文档中添加一个名为 version 的字段,然后在每次更新时递增它,并且在更新时确保文档中的版本与您读取的版本相同。

我可以提供更多详细信息,但这在http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22UpdateifCurrent%22中有相当详细的记录

让我知道这是否适合你,