mongodb - MongoDB 中的并行更新问题
问题描述
我们有一个字段可以同时更新用户操作、管理员操作和 cron,那么我们应该怎么做才能在 MongoDB 中处理这种情况。
例如,当 cron 运行时,用户的集合中有一个“余额”字段用户的余额减少了,现在如果用户正在充值并且管理员正在退款,那么余额不会得到更新。
所以请为这个问题提出任何解决方案。
解决方案
如果可能,请使用更新操作。它们在文档级别是原子的,所以这应该不是问题。
如果您使用的是最新版本的 mongodb,则可以使用事务进行读取-更新-写入。
如果您不能执行任何这些操作,则可以使用版本控制模拟乐观锁定方案,以防止意外覆盖。有几种方法可以做到这一点,但通常是这样的:
- 阅读文档。文档有一个版本字段(可以是整数,也可以是唯一的 ObjectId。不要使用时间戳)
- 在内存中进行修改并更新版本(增加整数,或生成新的 ObjectId)
- 使用包含(版本:oldVersion)的查询更新文档
如果有人在您阅读文档之后但在您更新之前更新了文档,这将失败。如果失败,请重试。
推荐阅读
- java - 尝试发送 UDP 数据包时出现绑定异常
- r - 如何使用 `ggplot` 和 `xlim()` 增加轴分辨率
- jar - 将带有 java 类的文件夹编译成 JAR
- javascript - 如何使用js获取会话的值
- gojs - 从 Go js 中的 License Certificate No 中查找许可证密钥
- javascript - 多个 setTimeout:并行还是递归?
- arrays - var 和 := 在 slice 声明 go 语言中的区别
- html - Angular6根据构建配置更改站点日志
- php - 如何知道本地托管的 php 脚本加载时间
- python - Python argparse:传递没有参数名称的单个参数