面试题答案
一键面试-
文档版本号在基本文档更新操作中的作用:
- 乐观并发控制:CouchDB使用版本号(
_rev
)来实现乐观并发控制。当一个客户端获取文档时,它也获取了该文档当前的版本号。当客户端尝试更新文档时,它必须在更新请求中包含这个版本号。CouchDB会将请求中的版本号与服务器上存储的文档版本号进行比较。如果两者匹配,更新操作会被允许执行,并且文档的版本号会更新为新的值。如果不匹配,说明在该客户端获取文档后,其他客户端已经对文档进行了更新,此时CouchDB会返回一个错误,客户端需要重新获取文档并基于最新版本进行更新。 - 数据一致性:版本号有助于维护数据的一致性。通过确保更新操作基于最新版本,CouchDB可以防止由于并发更新导致的数据丢失或不一致情况。
- 乐观并发控制:CouchDB使用版本号(
-
简单更新场景下版本号的变化示例:
- 初始状态:
- 假设我们有一个简单的CouchDB文档,存储用户信息,如下:
- 初始状态:
{
"_id": "user1",
"_rev": "1-abcdef",
"name": "Alice",
"age": 30
}
- 第一次更新:
- 客户端A获取了这个文档,看到版本号是
1-abcdef
。客户端A决定将用户的年龄更新为31。它发送如下的更新请求(假设使用HTTP PUT请求,简化格式示例):
- 客户端A获取了这个文档,看到版本号是
{
"_id": "user1",
"_rev": "1-abcdef",
"name": "Alice",
"age": 31
}
- CouchDB接收到请求后,检查请求中的版本号`1-abcdef`与服务器上存储的文档版本号匹配。更新操作成功执行,文档版本号更新为新的值,比如`2-ghijkl`。此时文档在服务器上的状态变为:
{
"_id": "user1",
"_rev": "2-ghijkl",
"name": "Alice",
"age": 31
}
- 第二次更新(并发场景模拟):
- 假设客户端B在客户端A更新文档之前获取了文档,它看到的版本号也是
1-abcdef
。客户端B决定将用户的名字更新为Bob
,并发送更新请求:
- 假设客户端B在客户端A更新文档之前获取了文档,它看到的版本号也是
{
"_id": "user1",
"_rev": "1-abcdef",
"name": "Bob",
"age": 30
}
- 但是,此时服务器上文档的版本号已经是`2-ghijkl`。CouchDB接收到客户端B的请求,发现请求中的版本号`1-abcdef`与服务器上的版本号`2-ghijkl`不匹配,更新操作失败,CouchDB会返回一个错误,告知客户端B需要重新获取文档并基于最新版本进行更新。客户端B需要重新获取文档,看到版本号`2-ghijkl`,然后修改请求中的版本号并再次发送更新请求才能成功更新文档。