面试题答案
一键面试常见冲突情况
- 文档版本冲突:当多个客户端同时尝试更新或创建同一个文档时,CouchDB 为每个文档维护一个修订版本号。如果两个客户端基于相同版本号进行修改并尝试保存,就会产生冲突。例如,客户端 A 和客户端 B 同时读取文档
doc1
的版本号为1 - abc
,A 先修改保存,版本号变为2 - def
,此时 B 再保存就会冲突,因为 B 基于的还是1 - abc
版本。 - 唯一键冲突:在设计文档时,如果有某些字段被视为唯一标识(类似数据库中的唯一键),当不同客户端同时创建文档,且这些文档的唯一标识字段值相同,就会出现冲突。比如,在用户注册场景中,用户名被设定为唯一,若两个用户同时注册相同用户名的账号就会冲突。
解决冲突机制
- 修订版本号处理:CouchDB 会在发生冲突时返回带有冲突信息的响应,客户端可以获取最新版本号,重新读取文档,将自己的修改合并到最新版本上,然后再次尝试保存。例如,客户端 B 收到冲突响应后,获取到
doc1
的最新版本号2 - def
,重新读取文档,将自己的修改应用到这个最新版本上,再保存。 - 手动解决冲突:CouchDB 会将冲突的文档版本存储在
_conflicts
字段中。管理员或开发者可以通过查看这些冲突版本,手动决定保留哪个版本,然后删除其他冲突版本。例如,在唯一键冲突场景下,管理员可以根据业务规则决定保留哪个用户名注册的账号,删除冲突的账号文档。