mongodb:当两个客户端操作同一个集合时,它是如何表现的?

时间:2012-07-10 00:33:45

标签: python mongodb

我有两个客户端(python)操作同一个集合,该集合用作池,集合中的每个记录只能用于其中一个客户端。我使用下面的代码来确保它(它不是关键系统,因此可以容忍一点点错误)。

for i in range(100):
    record = collection.find_one({"used1":{"$exists":False}})
    record["used1"] = True
    collection.save(record)
    ...do sth I want...

但是我发现有时两个客户端没有同步,本地客户端获取记录,10秒后远程客户端也会记录相同的记录。

实际上,如果2个客户端在不到2秒的时间内获得记录,那是可以容忍的,但10秒就太长了。

我认为这里存在缓冲/同步问题,我可以做些什么来减少这些问题?

1 个答案:

答案 0 :(得分:3)

您的代码不是线程安全的 - 这意味着它不能保证两个客户端不能同时将记录[“used”]字段更新为“True”,并且两者都认为它们是第一个/仅仅是这样做。

您需要使用的是findAndModify命令,如果该字段不存在,它将以“True”原子更新记录,然后将该记录返回给刚刚更新的客户端。

这保证每个文档只能由一个线程处理,但是,您仍然必须处理代码现在遇到的同样问题 - 如果客户端进程在将此“used1”字段设置为true之后但在它之前死亡做它的工作,你将使你的数据处于不一致的状态。