V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
dumbbell5kg
V2EX  ›  程序员

请教一个 mongodb 的问题

  •  
  •   dumbbell5kg · 2022-10-09 15:01:22 +08:00 · 1272 次点击
    这是一个创建于 805 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这是我的 document:

    {"pinyinOfName" : [
    "MUBANXIANGMU",
    "MBXM"
    ]
    }

    操作:
    1 、一个 findAndModify 去 pull 第一条记录"MUBANXIANGMU"
    2 、另一个 findAndModify 去 pull 第二条记录"MBXM"

    问题:
    1 和 2 同时执行,会不会出现这种情况:1 的结果返回了"MBXM",2 的结果返回了"MUBANXIANGMU"?
    如果不会,又是为什么呢,求大佬抬一下
    7 条回复    2022-10-09 17:02:39 +08:00
    sunkai0609
        1
    sunkai0609  
       2022-10-09 15:05:28 +08:00
    mongodb 单文档操作应该是原子的吧
    dumbbell5kg
        2
    dumbbell5kg  
    OP
       2022-10-09 15:17:02 +08:00
    @sunkai0609 我理解单文档的原子性是指,一条语句更新多个字段,要么字段都更新成功,要么都更新失败,不太清楚原子性和问题有什么关系
    sunkai0609
        3
    sunkai0609  
       2022-10-09 15:36:55 +08:00
    @dumbbell5kg 额,就是即使你并发请求,在 mongodb 处理时可以看做是顺序执行的。我是这么认为的,不保真。。
    leopod1995
        4
    leopod1995  
       2022-10-09 16:00:48 +08:00
    不会。
    首先"并发"是一个宏观概念上的并发,在底层执行一定是有序执行。在 mongodb 层面,每个 op 都有自己的时间戳,用来保证事务的执行顺序。所以结果是 1/2 任意一条先执行,返回包含 2 条记录的数组的原文档,然后第二个 op 返回包含 1 条记录的新文档。
    When modifying a single document, both db.collection.findAndModify() and the updateOne() method atomically update the document 。
    dumbbell5kg
        5
    dumbbell5kg  
    OP
       2022-10-09 17:00:47 +08:00
    @leopod1995 查了一个多小时的文档,我现在理解 mongo 是用锁来保证原子性的,既然有锁,那么 findAndModify 一定是顺序执行的
    dumbbell5kg
        6
    dumbbell5kg  
    OP
       2022-10-09 17:01:12 +08:00
    感谢大佬们
    dumbbell5kg
        7
    dumbbell5kg  
    OP
       2022-10-09 17:02:39 +08:00
    @leopod1995 另外其实我是想用 findAndModify 返回更新后的结果的,所以才问了这个问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3480 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:53 · PVG 08:53 · LAX 16:53 · JFK 19:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.