这是一个 MongoDB 答案。
我不太确定你的逻辑是什么。更新二级索引与能够回滚多语句事务(例如多次更新)无关。
MongoDB 每个文档都有事务,这对于更新索引很重要。如果需要,可以使用日志来撤销这些操作。
这必须发生在同一笔交易中。
是的,就像 RDBMS 一样。你应用的索引越多,你的写入速度就越慢,在我看来你知道为什么。
当写入发生时,MongoDB 将使用适用于特定索引的字段更新适用于该集合的所有索引。
此外,如果索引可以驻留在与数据不同的主机上
我不确定 MongoDB 是否允许这样做,我相信它有一个 JIRA;但是,我目前找不到那个 JIRA。
然后需要存在分布式锁和/或两阶段提交,这样更新才能以原子方式工作。
最有可能的。允许此功能将......好吧,我们只是说创建一个毛球。
即使在分片设置中,每个范围的索引也驻留在分片本身上,而不是在配置服务器上。
但是如果这些数据库不支持多对象事务(这意味着它们不会跨多个主机对数据进行两阶段提交)
这不是两阶段提交的意思。我相信您需要了解什么是两阶段提交:http ://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/
我想如果您谈论的是涵盖多个分片的交易,那么,嗯,好的。
他们使用什么方法来保证驻留在与数据分开的 B 树结构中的二级索引不会过时?
Agan 我不确定为什么多文档事务会影响索引是否过时,您没有跨文档分组。唯一的例外是唯一索引,但也适用于单个文档更新;请注意,它的唯一性在分片设置中有点毛茸茸,无法保证。
在您正在创建的索引中,通常每个文档前缀键都有一个条目,除非它是文档上的多键索引,那么您可以创建多个索引,但是,无论哪种方式索引更新都是针对单个对象完成的,而不是通过多文档交易,我不确定你在这里的逻辑是什么,因此这是我给出的答案。