与MongoDB互斥 [英] Mutex with MongoDB
本文介绍了与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屋!
查看全文