两台机器同时更新数据库时modifiedCount是否必然一个为1一个为0?
并发更新同一条订单记录的返回值结论
只要你使用的是支持文档级/行级原子操作的主流数据库(如MongoDB、MySQL InnoDB引擎等),该场景下可以100%保证两台机器的返回结果永远是一台modifiedCount = 1,另一台modifiedCount = 0,不会出现两个1或者两个0的情况。
原理说明
你代码中调用的updateOne操作在数据库层面是原子执行的,整个匹配+更新的过程不会被其他请求打断:
- 数据库执行该操作时会先给匹配到的目标记录加锁,同一时间只有一个请求能持有锁完成操作
- 第一个拿到锁的请求成功将
paid字段改为true后释放锁,第二个请求再执行匹配时,已经没有符合orderNumber: 1, paid: false条件的记录,因此不会触发更新,返回修改数为0
注意事项
- 该逻辑成立的前提是
orderNumber字段有唯一索引,保证筛选条件只会匹配到最多一条记录 - 不要把逻辑拆成「先查询订单状态、再判断是否更新」的非原子操作,那样会出现并发竞争导致的重复更新问题,直接把状态判断写在
updateOne的筛选条件里是分布式场景下避免并发冲突的最优实践之一
内容的提问来源于stack exchange,提问作者manidos
相关产品推荐
相关产品推荐

