面试题答案
一键面试基本原理
CouchDB使用多版本并发控制(MVCC)机制来处理版本号冲突。每个文档都有一个_rev
(修订版本号)属性,每次文档更新时,这个版本号会递增。
版本号在文档更新过程中的作用
- 标识文档状态:
_rev
属性就像文档的“指纹”,代表文档当前的状态。不同的修订版本通过不同的_rev
值来区分。 - 确保一致性:客户端在更新文档时,需要在请求中包含当前文档的
_rev
值。CouchDB会检查请求中的_rev
与服务器上存储的文档_rev
是否一致。如果一致,则允许更新,并生成一个新的_rev
值;如果不一致,说明文档在客户端获取之后已经被其他客户端更新过,此时更新请求会被拒绝。
检测冲突
- 客户端请求时:当客户端发起更新文档的请求时,CouchDB会将请求中携带的
_rev
与服务器上存储的文档_rev
进行对比。如果两者不匹配,CouchDB会认为发生了冲突,并返回HTTP 409 Conflict状态码。 - 复制过程中:在CouchDB进行数据库复制时,也会检查文档的
_rev
。如果源数据库和目标数据库中相同文档的_rev
不同,就会检测到冲突。
处理冲突
- 客户端处理:当客户端收到HTTP 409 Conflict响应后,需要重新获取最新版本的文档,将自己的修改合并到最新版本上,然后再次发起更新请求。
- 自动合并(某些情况):CouchDB支持自动合并简单的文档修改,比如对文档中不同字段的修改。如果多个客户端修改的是文档的不同字段,CouchDB可以自动将这些修改合并到一起,生成一个新的修订版本。
- 手动解决:对于复杂的冲突,如对同一字段的不同修改,CouchDB无法自动合并。此时需要人工介入,手动解决冲突。可以通过CouchDB的冲突API获取冲突的文档版本,分析并合并这些版本,然后重新提交文档。