多个读者试图在mongodb中更新相同的文档

时间:2014-05-26 12:53:16

标签: java spring mongodb

我在mongo中的数据库(名称:db)中有一组配置文件(名称:配置文件)。每个配置文件都有{id, lastUpdatedAt, createdAt}个字段。根据配置文件的lastUpdated字段,可以确定每个配置文件都是陈旧的。如果now_in_millisecs-profile.lastUpdated>30*60*1000(30分钟),个人资料已失效。

我有多个工作人员(在diff.machines上运行)试图抓住未使用的配置文件并假设他们拥有。所有工人都试着阅读profiles.all();循环浏览每个配置文件,检查过时的配置文件并抓住它。 (如果没有配置文件是免费的,则创建新的配置文件)。每个活动工作者每隔30分钟(我上面检查的同一时间窗口)不断更新lastUpdated

当我尝试这个设置时,我看到多个工作人员收到相同陈旧的个人资料。我想这是因为,所有工作人员都看到相同陈旧的个人资料,并决定重复使用它,每个人都获得相同的个人资料名称。我怎样才能在mongodb中避免这种情况。

我是否应该在mongodb中使用Transactions(不直接支持)。看起来像一个文件上的读写者锁定在这里没有帮助。我使用的是spring-mongo-java。

1 个答案:

答案 0 :(得分:0)

我不是100%确定你要做什么,或者如果这会解决它,但看看findAndModify()。它可以更新它找到的第一个(陈旧)doc并返回它。然后其他工作人员的后续检查将会看到其他文档,而不是那个。