pymongo中find_one_and_update()是否为原子操作?
关于pymongo中find_one_and_update()的原子性问题解答
关于find_one_and_update()的原子性可靠性
你完全可以信赖该方法的原子性。pymongo的find_one_and_update()本质是对MongoDB原生findAndModify命令的封装,MongoDB对所有单文档操作都默认保证原子性,查询和更新作为同一个命令的两个环节,全程不会被其他对该文档的写入操作插入,不存在你担心的操作间隙被篡改的问题。
其他保证同类操作原子性的方案
- 如果你不需要获取修改前后的文档内容,使用
update_one()即可达到完全一致的原子性效果,二者的核心差异仅为find_one_and_update()会返回匹配的文档实体,update_one()仅返回修改状态结果。 - 如果涉及跨多文档的原子操作需求,可使用MongoDB 4.0及以上版本支持的多文档事务,将多个文档的查询、修改逻辑放入同一个事务中即可保证整体原子性,要么全部生效要么全部回滚,不过事务的性能开销远高于单文档原子操作,非必要场景不建议使用。
- 为避免并发场景下的修改冲突,还可以自行实现乐观锁逻辑:给文档新增一个
version版本字段,每次查询时拿到当前文档的版本号,更新时将version == 你查询到的版本号作为查询条件的一部分,同时将版本号+1作为更新内容的一部分。如果最终返回的更新条数为0,说明该文档在你查询到更新的间隙已经被其他操作修改,此时你可以重试整个流程即可。
内容的提问来源于stack exchange,提问作者AnjaM
相关产品推荐
相关产品推荐

