MongoDB多个线程同时更新同一文档



我使用Atlas MongoDB作为数据库(使用MongoDB版本4.2创建集群(,并使用spring Data MongoDB jar(2.2.0 RELEASE(进行插入和更新操作。我有一个包含数千个文档的集合。我为每个文档都有一个自定义的唯一密钥(Id(。

更新场景-首先我需要从数据库中读取文档,并根据数据库文档对新传入的文档进行一些逻辑处理,然后进行最终更新。(读取->逻辑->更新(。它可以很好地处理单个线程,但不能处理更新同一文档的多个线程每次我收到同一文档的第二条消息/线程时,我都希望在阅读前提交上一条线程。

MongoDB或SpringData MongoDB中是否有任何事务原子性一致性级别(酸性属性(来处理此问题。

步骤:

Application receives inputMessage.
Read the existing document from DB
execute the logic.
Update DB.

2021-01-12 20:08:00.952[org.springframework.kafka.KafkaListenerEndpointContainer#1-96-C-1]信息输入消息是{"飞行":{"事件":"ETA","fltNum":"1111"}(

2021-01-12 20:08:00.961[org.springframework.cafka.KafkaListenerEndpointContainer#1-96-C-1]更新了信息飞行数据。

2021-01-12 20:08:00.979[org.springframework.kafka.KafkaListenerEndpointContainer#1-137-C-1]信息输入消息是{"飞行":{"事件":"FLTPLN","fltNum":"1111"}}

2021-01-12 20:08:00.986[org.springframework.kafka.KafkaListenerEndpointContainer#1-42-C-1]信息输入消息是{"飞行":{"事件":"LOADPLAN","fltNum":"1111"}}

2021-01-12 20:08:00.993[org.springframework.cafka.KafkaListenerEndpointContainer#1-137-C-1]信息-飞行数据更新

2021-01-12 20:08:00.996[org.springframework.cafka.KafkaListenerEndpointContainer#1-42-C-1]信息-飞行数据更新

此处线程1-96-C-1成功完成。螺纹1-137-C-1和1-42-C-1出现问题。

这里,1-137-C-1是第一个,它将从DB中读取现有文档(由1-96-C-1提交(。在1-137-C-1更新数据库之前,我们收到了1-42-C-1。现在1-42-C-1也读取1-96-C-1提交的数据,因为1-137-C-1尚未更新。

我不想这样,即使我们收到了1-42-C-1,也需要等到1-137-C-1完成更新。

这里的问题是,由于网络延迟或许多其他原因,第二个请求可能会在第一个请求之前先执行,这会使请求无序。

它与mongodb无关。Mongodb提供文档级并发。

您需要有一种方法来识别应用程序中以前的线程请求状态。

最新更新