【问题标题】:mongodb: how does it behave when two clients manipulate the same collection?mongodb:当两个客户端操作同一个集合时,它的行为如何?
【发布时间】:2012-07-10 00:33:45
【问题描述】:

我有两个客户端(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秒太长了。

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

【问题讨论】:

标签: python mongodb


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2014-02-23
    • 2023-03-11
    • 2012-09-07
    相关资源
    最近更新 更多