首页 > 解决方案 > MongoDB 中的并行更新问题

问题描述

我们有一个字段可以同时更新用户操作、管理员操作和 cron,那么我们应该怎么做才能在 MongoDB 中处理这种情况。

例如,当 cron 运行时,用户的集合中有一个“余额”字段用户的余额减少了,现在如果用户正在充值并且管理员正在退款,那么余额不会得到更新。

所以请为这个问题提出任何解决方案。

标签: mongodbconcurrency

解决方案


如果可能,请使用更新操作。它们在文档级别是原子的,所以这应该不是问题。

如果您使用的是最新版本的 mongodb,则可以使用事务进行读取-更新-写入。

如果您不能执行任何这些操作,则可以使用版本控制模拟乐观锁定方案,以防止意外覆盖。有几种方法可以做到这一点,但通常是这样的:

  • 阅读文档。文档有一个版本字段(可以是整数,也可以是唯一的 ObjectId。不要使用时间戳)
  • 在内存中进行修改并更新版本(增加整数,或生成新的 ObjectId)
  • 使用包含(版本:oldVersion)的查询更新文档

如果有人在您阅读文档之后但在您更新之前更新了文档,这将失败。如果失败,请重试。


推荐阅读