是否可以在MongoDB中锁定一些条目,并进行不考虑锁定的记录程序的查询



我有一个mongoDB,它包含一个"任务"列表和两个执行器。这两个执行器必须从数据库中读取一个任务,将其保存在"in_EXECUTION"状态并执行该任务。当然,我不希望我的两个执行者执行相同的任务,这是我的问题。

我使用交易查询。通过这种方式,当执行器试图更改任务的状态时,它会得到"写入异常",并且必须重新启动并读取新任务。这种方法的问题是,有时执行器在正确保存任务状态的更改并执行新任务之前会遇到很多错误。所以我好像只有一个执行官。

注:-我不想在读/写时阻塞我的整个数据库,因为这样我会减慢整个过程。-我认为有必要保存任务的状态,因为这可能是一项长期任务。

我问是否可以只锁定某些记录,并对"未锁定"的记录执行查询,但解决我问题的每一条建议都会得到真正的通知。

提前谢谢。

第1版:对不起,我简化了上面问题中的概念。事实上,我提取了n条我必须发送的信息。我必须在100条消息的块中发送这些消息,所以我的执行者会将在100条信息的块中提取的消息进行拆分,并基本上将它们传递给其他执行者。每个执行器提取消息,然后用新状态更新它们。我希望这一点现在更加清楚。

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public List<PushMessageDB> assignPendingMessages(int limitQuery, boolean sortByClientPriority,
LocalDateTime now, String senderId) {
final List<PushMessageDB> messages = repositoryMessage.findByNotSendendAndSpecificError(limitQuery, sortByClientPriority, now);
long count = repositoryMessage.updateStateAndSenderId(messages, senderId, MessageState.IN_EXECUTION);
return messages;
}

数据库更新:

public long updateStateAndSenderId(List<String> ids, String senderId, MessageState messageState) {
Query query = new Query(Criteria.where(INTERNAL_ID).in(ids));
Update update = new Update().set(MESSAGE_STATE, messageState).set(SENDER_ID, senderId);
return mongoTemplate.updateMulti(query, update, PushMessageDB.class).getModifiedCount();
}

您必须一个接一个地进行锁定。

试图一次锁定100条记录,同时进行第二个过程——同时锁定100条纪录(两者之间没有任何协调(——几乎肯定会导致一个重叠的集合,除非你有大量可用记录可供选择。

根据您的应用程序,让一个线程(另一个线程只是"热备用"(完成所有工作也是可以接受的,只要单个工作线程不过载。

最新更新