面试题答案
一键面试1. CouchDB冲突检测机制
CouchDB 使用多版本并发控制(MVCC)来检测冲突。每个文档都有一个 _rev
(修订版本号)属性。当多个客户端同时尝试修改同一个文档时,每个客户端都会基于该文档的当前 _rev
创建一个新的修订版本。
例如,假设文档初始 _rev
为 1-abc
,客户端 A 和客户端 B 同时读取该文档。此时,它们都基于 1-abc
进行修改。当客户端 A 首先完成修改并保存时,文档的 _rev
可能变为 2-def
。然后客户端 B 尝试保存它的修改,CouchDB 会发现客户端 B 所基于的 _rev
(1-abc
) 与当前文档的 _rev
(2-def
)不一致,从而检测到冲突。
2. 默认冲突解决策略
CouchDB 默认采用“最后写入获胜(Last Write Wins, LWW)”策略。当检测到冲突时,CouchDB 会保留最新版本的文档修订(即具有最大修订版本号的修订),而丢弃其他冲突版本。这些被丢弃的冲突版本并不会被完全删除,而是被存储在文档的 _conflicts
数组中,开发者可以根据需要手动处理这些冲突版本。
3. 实际应用场景中可能出现冲突的情况
- 实时协作应用:例如多人在线文档编辑。多个用户同时编辑同一个文档,可能同时对文档的不同部分进行修改并尝试保存,这就会导致文档冲突。
- 移动应用与服务器同步:移动设备可能在离线状态下对本地存储的文档进行修改,当设备重新连接到服务器时,设备上的文档版本可能与服务器上的版本不同,从而引发冲突。
4. 利用 CouchDB 的特性应对冲突
- 手动处理冲突:开发者可以通过查询文档的
_conflicts
数组,获取所有冲突版本。然后根据业务逻辑决定如何合并这些冲突版本。例如,在多人在线文档编辑场景中,可以开发算法来自动合并不同用户的编辑内容。 - 自定义冲突解决策略:CouchDB 允许开发者编写自定义的冲突解决函数(使用 JavaScript)。通过这种方式,开发者可以根据应用的特定需求来实现更复杂、更符合业务逻辑的冲突解决策略,而不是依赖默认的“最后写入获胜”策略。