面试题答案
一键面试基本原理
CouchDB乐观锁基于文档的修订版本号(_rev
)来实现。其核心思想是在读取文档时,获取文档的当前修订版本号。当尝试更新文档时,CouchDB会检查请求中携带的修订版本号是否与数据库中该文档的当前版本号一致。如果一致,则允许更新并递增修订版本号;如果不一致,说明在读取文档和尝试更新之间,文档已被其他操作修改,此时更新请求将失败。
数据结构
- 文档:CouchDB中的每个文档都包含一个特殊的属性
_rev
,它记录了文档的修订版本号。每次文档被成功修改,_rev
的值就会发生变化。例如,初始创建文档时,_rev
可能是1-abcdef123456
,后续每次更新,_rev
中的数字部分会递增,字母部分也会根据更新内容的哈希等算法重新生成。
关键步骤
- 读取文档:客户端向CouchDB发送读取文档的请求。CouchDB返回文档内容,同时包含当前的
_rev
值。 - 准备更新:客户端在本地对文档进行修改,然后在更新请求中带上之前读取到的
_rev
值。 - 更新验证:CouchDB收到更新请求后,将请求中的
_rev
值与数据库中该文档当前的_rev
值进行比较。 - 更新操作:
- 如果两个
_rev
值相同,CouchDB允许更新操作,更新文档内容,并生成一个新的_rev
值。 - 如果两个
_rev
值不同,CouchDB拒绝更新操作,并返回冲突错误(通常HTTP状态码为409 Conflict),提示客户端文档已被其他操作修改,需要重新读取最新版本后再尝试更新。
- 如果两个