mongodb - 在同一个文档上并发 findAndModify
问题描述
假设有 2 个活动事务A
和B
(两者都是活动的,因此尚未提交)。首先,A
在findAndModify
与谓词匹配的随机文档上执行并保持事务处于活动状态。现在B
做同样的findAndModify
事情并且恰好落在同一个文件上。现在会发生什么?被B
阻止直到A
结束?
如果是这样,有没有办法让B
选择另一个与给定谓词匹配但未被并发会话锁定的文档?在 SQL 中,这将是一个SKIP LOCKED
指令。
解决方案
现在 B 执行相同的 findAndModify 并恰好落在同一个文档上。现在会发生什么?B 是否被阻塞直到 A 结束?
当您尝试提交第二个事务时,您应该收到 WriteConflict 错误。
同样,这是可以简单测试的。
如果是这样,有没有办法让 B 选择另一个与给定谓词匹配但未被并发会话锁定的文档?在 SQL 中,这将是一个 SKIP LOCKED 指令。
不太可能,因为这需要交易检查所有其他交易的状态。在分片集群中,每个事务都是 mongos 的本地事务,这在一般情况下甚至是不可能的。
关于“跳过锁定”,MVCC 不需要锁定,因此很可能没有任何锁定可以跳过。
推荐阅读
- typo3 - TYPO3中如何通过uid获取图像对象?
- java - Android:以编程方式向图片添加红色箭头
- google-cloud-firestore - 如何在 firestore 集合的嵌套属性中查找数据?
- java - 拒绝在 Groovy 上使用 ==(或更改其行为)
- node.js - 如何将数字添加到现有字段
- javascript - 在 Node.js 中完成异步进程之前向客户端发送 res
- python - Pandas,如何对子集进行列操作?
- firebase - 如何在诸如“roomName”和“roomPassword”之类的flutter中检查来自firebase cloud的一些信息?
- javascript - 如何删除数组中的空对象?
- sql-server - SQL server - 通过命令行创建报告