基于MongoDB实现有界原子计数器的正确性与原子性问询
有界原子计数器的MongoDB实现验证
条件递增与返回结果判断
- 你的思路是对的:这段
findAndModify操作仅在count ≤ 10时才会执行递增。查询条件{ count: { $le: 10 } }会匹配当前计数器值符合要求的文档,只有匹配成功时,才会触发$inc: { count: 1 }的更新逻辑。 - 可以通过无文档返回判断计数器达最大值:当
count已经超过10时,查询条件无法匹配到目标文档,findAndModify会返回null(或无结果),此时即可判定计数器已达到上限10。
并发场景下的递增正确性
完全能保证递增的正确性,不会出现两个进程都把计数器递增到1的情况。因为MongoDB的findAndModify是原子操作——MongoDB会对单个文档的读写操作加锁,并发请求会被串行化处理。比如当count=0时,进程A和B同时发起请求,其中一个会先获得锁,将count从0改成1并释放锁;另一个进程获取锁后,会基于最新的count=1继续递增到2,最终计数器会依次变成1、2,不会出现冲突。
对应的代码示例:
db.runCommand({ findAndModify: "counter", query: { count: { $le: 10 } }, update: { $inc: { count: 1 } } })
内容的提问来源于stack exchange,提问作者broadbear
相关产品推荐
相关产品推荐

