面试题答案
一键面试CouchDB 检测版本冲突
- 基于文档修订版本号:CouchDB 为每个文档维护一个修订版本号(
_rev
)。当文档被创建时,会有一个初始的修订版本号。每次文档更新,修订版本号都会改变。当多个客户端同时尝试更新同一文档时,CouchDB 会比较客户端提供的修订版本号与服务器上当前文档的修订版本号。如果客户端提供的版本号与服务器上的不一致,就判定发生了版本冲突。
CouchDB 处理版本冲突
- 冲突文档保存:当版本冲突发生时,CouchDB 不会简单地覆盖新的更新。而是会将产生冲突的文档都保存下来,这些冲突文档会被标记为冲突状态,并存储在服务器上。在文档中,会有一个
_conflicts
数组,列出所有冲突版本的修订号。 - 手动解决:开发者需要手动处理这些冲突。可以通过读取冲突文档及其
_conflicts
数组中列出的所有冲突版本,分析每个版本的更改内容,然后决定如何合并或选择最终的版本。CouchDB 提供了 API 来获取冲突文档及其各个冲突版本,方便开发者进行处理。
开发者避免或应对冲突的注意事项
- 乐观锁机制:在应用层面使用乐观锁。开发者在读取文档时,记录下
_rev
号。在更新文档时,将记录的_rev
号作为参数传递给更新请求。如果在读取和更新之间,文档被其他客户端修改,服务器会返回冲突错误,开发者可以捕获这个错误,重新读取文档并应用更新,以确保更新基于最新版本。 - 减少并发更新频率:在业务逻辑设计上,尽量减少对同一文档的并发更新频率。例如,可以对一些操作进行合并或批量处理,减少短时间内多次更新同一文档的情况。
- 预定义合并策略:根据业务需求,预先定义好处理冲突的合并策略。例如,在某些场景下,可以根据更新时间戳选择最新的更新;在另一些场景下,可能需要合并不同更新中的特定字段等。这样在冲突发生时,能够按照既定策略快速处理冲突。
- 使用复制过滤器:在进行数据复制时,通过使用复制过滤器,可以控制哪些数据被复制到其他节点。这样可以减少不同节点上对同一文档并发更新的可能性,降低冲突发生的概率。