面试题答案
一键面试冲突检测
在CouchDB的Append - Only存储模式下,每个文档都有一个_rev
(修订版本号)属性。每当文档被更新时,_rev
的值就会改变。当多个客户端同时尝试更新同一文档时,CouchDB通过比较文档的_rev
来检测冲突。如果两个或多个更新请求所基于的_rev
相同,CouchDB就认为发生了冲突。
冲突处理机制原理
CouchDB采用“最后写入获胜”(Last Write Wins, LWW)的原则作为基本处理思路,但会保留冲突版本以便后续处理。当检测到冲突时,CouchDB不会自动合并这些冲突的更新,而是将每个冲突的版本都保留下来,以文档的多个修订版本形式存在。这样做的目的是为了让应用层根据业务逻辑来决定如何处理这些冲突。
具体操作步骤
- 客户端请求更新:客户端向CouchDB发送文档更新请求,请求中包含文档当前的
_rev
值。 - 服务器检测冲突:CouchDB接收到更新请求后,将请求中的
_rev
与数据库中存储的文档_rev
进行比较。如果不匹配,说明文档在客户端获取之后已被其他客户端更新,发生冲突。 - 存储冲突版本:如果检测到冲突,CouchDB不会应用此次更新,而是将该更新作为一个新的修订版本存储,并标记为冲突版本。此时,文档的
_conflicts
属性会列出所有冲突的_rev
值。 - 客户端处理:客户端在接收到服务器返回的冲突响应后,可以根据业务需求来决定如何处理冲突。例如,可以重新获取最新版本的文档,合并冲突内容后再次提交更新;或者根据一定的规则(如时间戳、用户优先级等)选择一个版本作为最终版本。