面试题答案
一键面试利用文档修订版本号检测冲突
- 基本原理:CouchDB 中的每个文档都有一个修订版本号(
_rev
)。当多个客户端尝试同时更新同一个文档时,每个客户端操作后都会生成不同的修订版本号。如果一个客户端尝试保存文档时,它所期望的修订版本号与服务器上当前文档的修订版本号不一致,就表明发生了冲突。 - 示例场景:假设客户端 A 和客户端 B 同时获取到文档
doc
,其修订版本号为1 - abc
。客户端 A 先对文档进行修改并保存,此时文档的修订版本号变为2 - def
。当客户端 B 尝试保存它修改后的文档时,由于它预期的修订版本号还是1 - abc
,而服务器上已是2 - def
,就检测到了冲突。
基于修订版本号解决冲突的常见策略 - 最后写入者获胜
- 策略描述:在这种策略下,当发生冲突时,以最后到达服务器的修改为准。CouchDB 本身在某些配置下默认采用类似这种策略。例如,当使用 HTTP PUT 请求更新文档时,如果发生冲突,新的修订版本号会覆盖旧的。这意味着最后进行保存操作的客户端的修改会被保留,而其他较早的修改可能会丢失。
- 实现方式:在代码层面,当捕获到冲突错误(如 HTTP 409 冲突状态码)时,客户端可以重新获取最新版本的文档,合并自己的修改(如果可能),然后再次尝试保存。在实际应用中,需要权衡这种策略可能导致的数据丢失问题,尤其在需要保证数据完整性的场景下,可能需要更复杂的冲突解决机制。