面试题答案
一键面试乐观锁原理
CouchDB 采用乐观锁机制,假定在大多数情况下数据不会发生冲突。每次对文档进行修改时,文档会获得一个新版本号(_rev
)。
检测冲突
- 数据结构:CouchDB 文档包含一个
_rev
字段,其格式类似于1-abcdef123456
,其中1
代表版本号,abcdef123456
是一个哈希值,用于标识文档内容。 - 算法层面:当客户端读取文档时,获取到当前的
_rev
。在更新文档时,客户端将获取到的_rev
与要更新的文档一起发送到服务器。服务器在更新前,会检查当前文档的_rev
是否与客户端发送的_rev
一致。如果不一致,说明在客户端读取文档后,该文档已被其他客户端修改,从而检测到冲突。
处理冲突
- 数据结构:当冲突发生时,CouchDB 会将冲突的文档版本以
_conflicts
数组的形式存储在文档中。每个冲突版本的_rev
会被记录在这个数组里。 - 算法层面:
- 自动解决:CouchDB 会尝试自动解决一些简单的冲突,例如,如果新文档只是对旧文档进行了字段的添加或修改,且没有覆盖相同字段,CouchDB 可以合并这些更改。
- 手动解决:对于复杂冲突,需要人工介入。应用程序可以通过读取
_conflicts
数组获取冲突版本,然后根据业务逻辑选择合适的版本,或者进行合并操作。通常,这需要开发者编写自定义的冲突解决逻辑,从多个冲突版本中选择或生成最终有效的版本。