复制冲突文档的生成原理

复制冲突文档的生成原理


前些天在讨论 Domino 环境中各种 ID 时,提到了一些关于如何处理复制冲突的内容,由于其原理比较复杂,当时就没有展开讨论。今天有读者询问其中的细节,所以在这篇文章中我们就仔细研究一下这个话题。

上一次说到在复制过程中如果发现两个副本关系的文档其 OID 不同,那么说明这两个文档处于不同步的状态。首先分析两个文档的 $Revisions 域(此域记录了文档历次修改的时间),判断是否存在冲突:

  • 如果两个域值除了某一个文档多出来一些值以外,其余部分完全相同,如:

    A:时间1,时间2,时间3
    B:时间1,时间2,时间3,时间4,时间5

    则表示 B 文档在 A 文档的基础上额外多修改了两次,不存在冲突

  • 如果两个域值最初相同,然后各自出现了不同的部分,如:

    A:时间1,时间2,时间3,时间4
    B:时间1,时间2,时间3,时间5

    则表示两个文档在不同的时间分别修改过,存在冲突

如果存在冲突,下一步检查目标文档(就是这次复制过程中会被修改的那个)的 $ConflictAction 域,如果其值为“1”表示允许合并复制冲突,开始分析两个文档各个域值,以判断能否进行合并:

  • 首先通过 $Revisions 域和 Sequence Number 找出两个文档最后一致的版本,以下面数据为例:

    A $Revisions:时间1,时间2,时间3,时间4
    A SN:5
    B $Revisions:时间1,时间2,时间3,时间5
    B SN:5

    两个文档在时间3这一版本是一致的,从 SN = 5 往回反推可以得到一致版本为 4

  • 每个文档域也有一个 SN 属性,它记录了此域最后一次修改时文档的 SN。用文档域的 SN 与之前得到的一致版本号 4 进行比对,就可以得到在一致版本之后修改的域。
  • 如果两个文档修改过的域有重合的部分,说明在不同的副本中对相同的域同时做了修改,无法合并冲突;反之则可以合并

如果 $ConflictAction 域值不是“1”或者属于上一段所述无法合并冲突的情况,则必须创建冲突文档。下一步就是通过 Sequence Number 和 Sequence Datetime 来分析哪个文档作为主文档(winner),哪个文档作为冲突文档(loser):

  • SN 比较大的(在一致版本之后编辑次数较多的)文档是 winner
  • 如果 SN 相同,SD 比较大的(最后编辑的)文档是 winner

至此,一个崭新的复制冲突文档诞生了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值