面试题答案
一键面试- 冲突检测原理
- 版本号机制:CouchDB 为每个文档维护一个
_rev
(修订版本号)字段。每次文档更新时,_rev
会改变。当客户端尝试更新文档时,它需要在请求中包含当前已知的_rev
。CouchDB 会将请求中的_rev
与服务器上文档的实际_rev
进行比较。如果两者不匹配,就意味着在客户端获取文档和尝试更新之间,其他客户端已经对该文档进行了修改,从而产生更新冲突。
- 版本号机制:CouchDB 为每个文档维护一个
- 解决冲突的常用方法
- 自动方式:
- 最后写入者胜出(LWW):CouchDB 2.0 引入了多主复制功能,在这种情况下,CouchDB 采用最后写入者胜出策略。当发生冲突时,以最后到达服务器的更新为准。这意味着较新的
_rev
版本会覆盖旧的版本。这种方式简单高效,但可能会丢失较旧的更新内容,适用于对数据一致性要求不是特别严格,更注重写入性能的场景。
- 最后写入者胜出(LWW):CouchDB 2.0 引入了多主复制功能,在这种情况下,CouchDB 采用最后写入者胜出策略。当发生冲突时,以最后到达服务器的更新为准。这意味着较新的
- 手动方式:
- 客户端合并:当发生冲突时,CouchDB 会将冲突的文档版本都保留下来。客户端可以通过读取包含冲突版本的文档(通过
?conflicts=true
参数获取),分析不同版本之间的差异,然后手动合并这些版本的内容。例如,在一个协作编辑文档的场景中,客户端可以展示不同用户的修改部分,由用户决定如何合并这些修改,然后再将合并后的结果发送回服务器进行更新。 - 服务器端脚本合并:CouchDB 支持使用 JavaScript 编写的更新函数(
update
函数)。当发生冲突时,可以编写自定义的服务器端脚本来处理冲突。这个脚本可以根据业务逻辑来决定如何合并冲突的文档版本,例如,按照特定的规则合并不同版本中的数据字段,然后返回一个统一的新版本。
- 客户端合并:当发生冲突时,CouchDB 会将冲突的文档版本都保留下来。客户端可以通过读取包含冲突版本的文档(通过
- 自动方式: