如何解决在同一文档上并发 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 不需要锁定,所以很可能没有任何锁定可以跳过。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。