假设有两个数据库被复制,A和B.数据库A拥有一个包含四个修订版的文档。修订树如下所示:
+--- r2a --- r3a
/
r1----- r2b
当前的叶子修订显然是r3a
和r2b
。根据文档,只有这些修订在复制期间传输。所以数据库B将会看到这个:
r3a
r2b
数据库B如何知道这些修订的历史?据我所知,复制的唯一信息是两个版本,没有任何关于他们父母的概念。我错了吗?
更新:为什么数据库B应该知道历史记录?
考虑在第一次复制后对数据库A进行更多更改。每个分支都可以通过另一个修订进行修改。修订树看起来像这样:
+--- r2a --- r3a --- r4a
/
r1----- r2b --- r3b
让我们再做一次从A到B的复制。数据库B怎么知道,r4a
是r3a
的后代,因此r3a
不再是叶子修订版。 (与r3b
和r2b
相同。)换句话说:数据库B如何处于此状态:
r3a --- r4a
r2b --- r3b
而不是此状态(所有叶子修订版):
r3a
r4a
r2b
r3b
答案 0 :(得分:2)
CouchDB 2的文档包括复制算法的详细说明。答案很简单:在复制过程中传输修订历史记录 。您可以在此处阅读:http://docs.couchdb.org/en/latest/replication/protocol.html#upload-batch-of-changed-documents
答案 1 :(得分:1)
您在CouchDB中看到的“修订版”不版本控制机制。它们纯粹用于称为Multiversion Concurrency Control(或MVCC)的技术,它允许在不实现锁的情况下并发访问数据库。
名称“修订号”似乎表明它可以用于追踪文档的历史记录,但事实并非如此。正如您已经确定的那样,并非所有修订都会被复制。此外,压缩数据库时,将删除所有非当前修订。
答案 2 :(得分:0)
数据库B如何知道r4a是r3a的后代,因此r3a不再是叶子修订版。
因为r4a与r3a具有相同的ID - 它们的修订版ID不同于文档ID,所以很明显r4A是同一文档的较新版本吗?