【问题标题】:Concurrent findAndModify on the same document在同一个文档上并发 findAndModify
【发布时间】:2021-05-07 00:00:30
【问题描述】:

假设有 2 个活动事务 AB(两者都处于活动状态,因此尚未提交)。首先,A 对与谓词匹配的随机文档执行findAndModify 并保持事务处于活动状态。现在B 执行相同的findAndModify 并且恰好落在同一个文档上。现在会发生什么? B 是否被阻止直到 A 结束?

如果是这样,有没有办法让B 选择另一个与给定谓词匹配但未被并发会话锁定的文档?在 SQL 中,这将是一个 SKIP LOCKED 指令。

【问题讨论】:

    标签: mongodb concurrency mongodb-query locking findandmodify


    【解决方案1】:

    现在 B 执行相同的 findAndModify 并恰好落在同一个文档上。现在会发生什么?在 A 结束之前,B 会被阻塞吗?

    当你尝试提交第二个事务时,你应该得到 WriteConflict 错误。

    同样,这是可以简单测试的。

    如果是这样,有没有办法让 B 选择另一个与给定谓词匹配但未被并发会话锁定的文档?在 SQL 中,这将是一个 SKIP LOCKED 指令。

    不太可能,因为这需要交易检查所有其他交易的状态。在分片集群中,每个事务都是 mongos 本地的,这在一般情况下甚至是不可能的。

    关于“跳过锁定”,MVCC 不需要锁定,因此很可能没有任何锁定可以跳过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-01
      • 2022-10-21
      • 1970-01-01
      • 2021-03-04
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多