Java MongoDB中的并发读/写

Java MongoDB中的并发读/写,java,mongodb,concurrency,jvm,locking,Java,Mongodb,Concurrency,Jvm,Locking,我有一个集合,从中获取最大id,并使用最大id+1进行插入。id列在此集合中是唯一的 调用此服务的多个实例时,并发应用程序将读取同一集合并获取最大id。但由于访问了同一集合,因此会将相同的最大id返回给多个实例,我是否可以在读取此集合中的数据时获取集合的显式锁,并在写入Mongo DB后释放锁?使用mongoDB方法集合。findAndModify()您可以创建自己的“获取并增量”查询 例如: db.collection_name.findAndModify({ query: { docum

我有一个集合,从中获取最大id,并使用最大id+1进行插入。id列在此集合中是唯一的


调用此服务的多个实例时,并发应用程序将读取同一集合并获取最大id。但由于访问了同一集合,因此会将相同的最大id返回给多个实例,我是否可以在读取此集合中的数据时获取集合的显式锁,并在写入Mongo DB后释放锁?

使用mongoDB方法
集合。findAndModify()
您可以创建自己的“获取并增量”查询

例如:

db.collection_name.findAndModify({
  query: { document_identifier: "doc_id_1" },
  update: { $inc: { max_id: 1 } },
  new: true  //return the document AFTER it's updated
})

查看此页面以获取更多帮助:

试试这种方法

而不是在读取集合时获取
max id
,并将其增量为
max id+1

读取多个实例时,只需给出文档/集合,更新时遵循以下逻辑

Let us have the below part in a synchronized block, so that no two threads gets the same max id
synchronize() {
  getMaxId from collection
  increase it by 1
  insert the new document
}
请参阅:


希望有帮助

您是否尝试过使用外部同步或内置同步集合?能否请您详细说明,我们在MongoDB中是否有同步集合?您是否可以编写更多您想要实现的内容?看起来您需要事务,所以MongoDB可能不是这里的最佳选择。考虑或者如果你只需要原子方式来增加一些计数器。应用程序写在后端是蒙戈DB。我已经公开了一个服务,我们希望在MongoDB集合中进行自动增量。由于该服务的多个实例被公开,多个服务试图同时访问和更新数据库,这导致了数据库中的不一致性。这太棒了!你拿到我的钱了+1.在执行之前,是否在文档上添加锁?