首页 > 解决方案 > 在同一个文档上并发 findAndModify

问题描述

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

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

标签: mongodbconcurrencymongodb-querylockingfindandmodify

解决方案


现在 B 执行相同的 findAndModify 并恰好落在同一个文档上。现在会发生什么?B 是否被阻塞直到 A 结束?

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

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

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

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

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


推荐阅读