Mongodb 在多进程使用中的 FindAndModify 问题
我使用的是 Python 2.6.6、pymongo 1.9、mongodb 1.6.5 和 Ubuntu 10.10。
我遇到了一个关于 FindAndModify 命令的奇怪问题。
我有两个完全相同的进程同时在运行。它们通过 FindAndModify 从数据库中获取记录(这就像实现了一种队列)。
为了确保只有一个进程能获取到记录,我这样做:
find_and_modify({query:{"status":"loaded"},update:{"$set": {"status":"analyzing"}})
这个过程是这样的:
1号进程使用 findAndModify 来获取任务
2号进程使用 findAndModify 来获取任务
1号进程完成任务并保存结果
2号进程完成任务并保存结果
所以,进程获取到的记录状态是“已加载”,然后将其更改为“分析中”。如果这个操作是原子的,那么第二个进程就不应该看到这条记录,因为它不符合查询条件。
但是有时候,两个进程会同时获取到同一条记录,这就成了问题。
有没有人能告诉我为什么会发生这种情况,以及我该如何在 MongoDB 中实现一个队列,以防止多个进程同时读取文档?
谢谢。
2 个回答
0
你可以使用snapshot=True这个选项来避免出现这种重复的情况。
1
在我尝试在独立脚本中重现这个错误时,发现问题并不在MongoDB上。MongoDB的运行方式和手册上说的一样,所以这个问题就解决了。
对于那些遇到同样错误的人——别忘了检查其他线程或进程是否在运行时修改了队列数据。