MongoDB findOneAndUpdate并发执行时是否会同时匹配文档?
MongoDB并发执行findOneAndUpdate的原子性问题
场景说明
集合Schema定义:
{ "_id": ObjectId, "status": String }
初始数据文档:
{ "_id": 1, "status": "waiting" }
多线程并发执行的操作语句:
findOneAndUpdate({"_id": "1", "status": "waiting"}, {$set: { "status": "running"}})
问题解答
不会出现两个线程同时匹配到该文档的情况。
MongoDB的findOneAndUpdate是原子性操作,当第一个线程执行该语句时,MongoDB会对匹配到的目标文档加排他锁,在锁释放前,其他线程的同语句请求会处于等待状态。等第一个线程完成更新并释放锁后,文档的status已经变为running,此时其他线程的请求再匹配status: "waiting"的条件时,已经找不到符合要求的文档,因此不会返回更新后的结果。
你模拟1000个线程执行后只有一个线程输出文档的结果是正确的,这完全符合MongoDB原子操作的特性。
内容的提问来源于stack exchange,提问作者Grand
相关产品推荐
相关产品推荐

