与MongoDB互斥 [英] Mutex with MongoDB

查看:20
本文介绍了与MongoDB互斥的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有多个服务器共享一个公共MongoDB。在数据库中有一个作业列表,服务器必须完成。由于我希望在所有服务器上分担负载,并希望避免多台服务器执行相同的作业,因此我希望锁定该作业。

我的想法是:

  • 如果元素尚未获取,则将其设置为获取:

    db.collection.update({done: false, taken: false},{$set: {taken: true, takenBy: myIp}});

  • 检查服务器是否获得此元素的互斥:db.collection.findOne({taken: true, takenBy: myIp})

这是在MongoDB上同步多个工作服务器的最佳方式(该服务器是否像MySQL一样在单个事务中执行更新),或者该服务器是否可以同时执行多个第一个命令?

推荐答案

这方面的主要MongoDB特性是,对单个文档的更新是原子的。发件人the docs

在MongoDB中,写操作在单个 文档,即使该操作修改了多个嵌入的文档 在单个文档中。

当单个写入操作修改多个文档时, 对每个文档的修改是原子的,但操作作为一个整体 不是原子的,其他操作可能会交错。但是,您可以 使用以下命令隔离影响多个文档的单个写入操作 $isolated运算符。

因此,对于您的更新:

db.collection.update({done: false, taken: false},{$set: {taken: true, takenBy: myIp}});

这意味着它将自动查找匹配条件的文档,然后对其进行更新。因此,可以很好地将任务分配给给定的服务器。

有关在MongoDB中实现共享工作队列的更多详细信息,请参阅this other post。这里提到的一个要点是使用findAndModify执行更新返回更新的文档。

这篇关于与MongoDB互斥的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆