在MongoDB中选择更新跳过锁定
我有100多个工作线程,它们将轮询数据库,寻找新的工作 要接受作业,线程需要将一组文档的状态从在MongoDB中选择更新跳过锁定,mongodb,Mongodb,我有100多个工作线程,它们将轮询数据库,寻找新的工作 要接受作业,线程需要将一组文档的状态从NEW更改为IN\u PROGRESS,这样其他线程就无法查看相同的作业 在PostgreSQL中,使用SELECT FOR UPDATE SKIP LOCKED WHERE status=“NEW”语句可以很好地解决这个问题 有没有办法在MongoDB中对单个文档进行原子更新?对于批处理?有一种方法,其工作原理与您对单个文档的描述完全相同 对于一批,现在是不可能的,因为 在MongoDB中,写入操作,
NEW
更改为IN\u PROGRESS
,这样其他线程就无法查看相同的作业
在PostgreSQL中,使用SELECT FOR UPDATE SKIP LOCKED WHERE status=“NEW”
语句可以很好地解决这个问题
有没有办法在MongoDB中对单个文档进行原子更新?对于批处理?有一种方法,其工作原理与您对单个文档的描述完全相同
对于一批,现在是不可能的,因为
在MongoDB中,写入操作,例如db.collection.update()
,db.collection.findAndModify()
,db.collection.remove()
,在单个文档的级别上是原子的
但是,在MongoDB 4.0中,可以使用。对单个文档执行此操作-是<代码>查找并修改。对于批处理-不确定,但我认为不是。了解事务和原子性:,尽管查询可能匹配多个文档,db.collection.findAndModify()将只选择一个文档进行修改。findAndModify如何确保没有其他线程同时更改同一条目?@kris:我相信是(并且应该是)实现细节。重要的是,它的原子性是有保证的。。我有一个电子邮件cron任务要测试。。最坏情况。有人收到两封电子邮件。如果在一个事务中运行
find和modify
,该Update
对并发事务可见吗?