弹簧靴&x2B;Mongodb,如何读取并锁定文档,然后写入(保存)并解锁文档

弹簧靴&x2B;Mongodb,如何读取并锁定文档,然后写入(保存)并解锁文档,mongodb,spring-boot,concurrency,spring-data-mongodb,atomic,Mongodb,Spring Boot,Concurrency,Spring Data Mongodb,Atomic,我有几个例子,其中microservices使用相同的文档(有许多字段),并且这些字段中的许多字段在服务之间共享以进行一些验证。这就是我们在Crudepo API、并发性和原子性方面遇到的问题 用户1进行更新,因此它调用API并读取文档,执行业务逻辑,最后保存它。 用户2也使用相同的API进行相同的更新(使用不同的数据) 发生的情况是用户1工作得非常好,并将更新保存到文档中,用户2在用户1完成更新之前读取文档,因此他看不到用户1在文档中的更改。因此,当用户2更新文档(他们正在更新相同的数组,添加

我有几个例子,其中microservices使用相同的文档(有许多字段),并且这些字段中的许多字段在服务之间共享以进行一些验证。这就是我们在Crudepo API、并发性和原子性方面遇到的问题

用户1进行更新,因此它调用API并读取文档,执行业务逻辑,最后保存它。 用户2也使用相同的API进行相同的更新(使用不同的数据)

发生的情况是用户1工作得非常好,并将更新保存到文档中,用户2在用户1完成更新之前读取文档,因此他看不到用户1在文档中的更改。因此,当用户2更新文档(他们正在更新相同的数组,添加/更新元素)并保存时,他会覆盖用户1在其中所做的更改

理想情况下,我希望发生读取和锁定,因此用户2甚至不会读取文档,除非它准备好使用最新的更改进行读取,然后使用最新的数据执行业务逻辑。这将解决user2的问题。最后还有一个写(保存)和解锁,这样其他API就可以反应性地列出,然后轮到他们去查看该文档了


不过,对于这类问题,我愿意听取任何最佳实践和标准!非常感谢您的帮助

通常,对单个文档的所有写入都是原子的。MongoDB支持使用副本集和分片集群的事务。如果上述情况很少发生,您可以使用@Version属性实现乐观锁定。在上面的示例中,用户1将遇到OptimisticLockException,您可以重试业务逻辑。我没有使用它,但是有一个Spring重试项目可以帮助您重试业务逻辑。请看。更多关于Mongo乐观锁定的信息可以在这里找到。是的,我研究了@version的乐观锁定方法,但我不想这样做。重试不是处理并发问题的好方法,因为它会增加cpu使用率,$$用于读取,基本上是浪费资源。理想情况下,我想做一些事情,我可以锁定一个文档,因为它正在进行修改,所以任何阅读文档的人都必须等待…就像mongo在解锁之前不会将文档发回,所以任何“阅读”的人都必须等待更新完成,然后才能将文档发送到他们的方式