mongodb - 非 ACID RethinkDB 或 MongoDB 如何维护非相等查询的二级索引

标签 mongodb transactions indexing acid rethinkdb

这更像是“内部运作”不解的问题:

不支持*A*CID(意味着它们不能在单个事务中更新/插入然后回滚多个对象的数据)的noSQL数据库如何更新二级索引?

我的理解是——为了保持二级索引同步(否则它会变得陈旧读取)——这必须发生在同一个事务中。

此外,如果索引可以驻留在与数据不同的主机上,则需要存在分布式锁和/或两阶段提交才能使此类更新以原子方式工作。

但是如果这些数据库不支持多对象事务(这意味着它们不会跨多个主机对数据进行两阶段提交),它们使用什么方法来保证驻留在 B 树结构中的二级索引分开的数据不会陈旧吗?

最佳答案

这是一个很好的问题。

RethinkDB 始终将二级索引与表的主索引/数据存储在同一主机上。即使在连接的情况下,RethinkDB 也会对数据进行查询,因此二级索引、主索引和数据始终位于同一节点上。因此,不需要像两阶段提交这样的分布式锁定协议(protocol)。

RethinkDB 确实支持一组有限的事务功能——单文档事务。对单个文档的更改以原子方式记录。相关的二级索引更改也被记录为该事务的一部分,因此要么记录整个更改,要么根本不记录任何内容。

扩展有限的事务功能以支持单个分片中的多个文档很容易,但跨分片很难做到(出于您提到的分布式锁定原因),因此我们决定不实现事务对于多个文档。

希望这会有所帮助。

关于mongodb - 非 ACID RethinkDB 或 MongoDB 如何维护非相等查询的二级索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18163353/

相关文章:

mongodb - 在 XML 数据库中实现 MongoDB 样式文档引用

mongodb - 取消设置文档::元素,MongoCXX 查找选项投影

c# - 如何在MongoDB的FindOne中使用SetField For C# Driver

sql - DBMS 事务和序列化

mongodb - Node -mongodb- native : storing references to IDs

java - App Engine Java JDO 中的单元测试 XG 跨组事务

c# - TransactionInterop.GetDtcTransaction() 抛出 ArgumentNullException ... 有时

sql - 生成SQL Server数据库中所有索引、键的脚本

java - 创建一个函数来检查数组中的任何索引是否具有相同的值

postgresql - 只有一个整数组合的 Postgres 索引