面试题答案
一键面试1. 乐观锁工作原理
在高并发场景下,CouchDB乐观锁假设大多数情况下数据冲突不会发生。当客户端读取文档时,会获取到该文档的一个版本号(_rev
)。例如,客户端A读取文档doc1
,得到版本号1-abcdef
。
当客户端尝试更新文档时,会将之前获取到的版本号包含在更新请求中。比如,客户端A想要更新doc1
,它会在更新请求里带上版本号1-abcdef
。CouchDB在接收到更新请求时,会检查当前文档的实际版本号与请求中携带的版本号是否一致。如果一致,说明在客户端读取文档到尝试更新这段时间内,没有其他客户端修改过该文档,CouchDB就会执行更新操作,并生成一个新的版本号,例如2-ghijkl
。
2. 关键机制
- 版本号管理:CouchDB为每个文档维护一个版本号(
_rev
)。每次文档被成功更新,版本号就会递增变化。这个版本号是实现乐观锁的核心标识,用于判断文档在读取和更新之间是否被修改。 - 冲突检测与解决:如果客户端请求中的版本号与当前文档实际版本号不一致,说明在读取和更新之间有其他客户端修改了文档,此时就发生了冲突。CouchDB会拒绝更新请求,并返回冲突信息。客户端需要重新读取最新版本的文档,合并修改后再次尝试更新。例如,客户端B在客户端A读取文档后但未更新前修改了
doc1
,版本号变为2-ghijkl
,此时客户端A的更新请求就会因版本号不一致而失败。客户端A可以重新读取文档,获取到版本号2-ghijkl
,将自己的修改与最新文档内容合并后再次发起更新请求。