这更像是“内部运作”不解的问题:
不支持*A*CID(意味着它们不能在单个事务中更新/插入然后回滚多个对象的数据)的noSQL数据库如何更新二级索引?
我的理解是——为了保持二级索引同步(否则它会变得陈旧读取)——这必须发生在同一个事务中。
此外,如果索引可以驻留在与数据不同的主机上,则需要存在分布式锁和/或两阶段提交才能使此类更新以原子方式工作。
但是如果这些数据库不支持多对象事务(这意味着它们不会跨多个主机对数据进行两阶段提交),它们使用什么方法来保证驻留在 B 树结构中的二级索引分开的数据不会陈旧吗?
最佳答案
这是一个很好的问题。
RethinkDB 始终将二级索引与表的主索引/数据存储在同一主机上。即使在连接的情况下,RethinkDB 也会对数据进行查询,因此二级索引、主索引和数据始终位于同一节点上。因此,不需要像两阶段提交这样的分布式锁定协议(protocol)。
RethinkDB 确实支持一组有限的事务功能——单文档事务。对单个文档的更改以原子方式记录。相关的二级索引更改也被记录为该事务的一部分,因此要么记录整个更改,要么根本不记录任何内容。
扩展有限的事务功能以支持单个分片中的多个文档很容易,但跨分片很难做到(出于您提到的分布式锁定原因),因此我们决定不实现事务对于多个文档。
希望这会有所帮助。
关于mongodb - 非 ACID RethinkDB 或 MongoDB 如何维护非相等查询的二级索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18163353/