面试题答案
一键面试版本标识的生成
- 初次创建文档:当通过
PUT
请求向CouchDB创建新文档时,CouchDB会自动为该文档生成一个版本标识(_rev
)。例如,使用以下PUT
请求创建文档:
响应中会包含生成的PUT /your_database/your_doc_id HTTP/1.1 Content-Type: application/json { "key": "value" }
_rev
,类似如下:
这里的{ "ok": true, "id": "your_doc_id", "_rev": "1-abcdef1234567890" }
1
代表版本号起始为1,后面的abcdef1234567890
是一个唯一的哈希值。
更新操作时版本的检查与处理
- 获取当前版本:在更新文档前,客户端首先通过
GET
请求获取文档,响应中会包含当前文档的_rev
。例如:
响应:GET /your_database/your_doc_id HTTP/1.1
{ "_id": "your_doc_id", "_rev": "1-abcdef1234567890", "key": "value" }
- 更新文档并携带版本:客户端在更新文档时,需要在
PUT
请求中携带获取到的_rev
。例如:PUT /your_database/your_doc_id HTTP/1.1 Content-Type: application/json { "_id": "your_doc_id", "_rev": "1-abcdef1234567890", "key": "new_value" }
- 版本检查与处理:CouchDB在接收到更新请求时,会检查请求中的
_rev
与服务器上该文档当前的_rev
是否一致。- 如果一致,CouchDB会更新文档,并生成一个新的
_rev
,版本号加1,例如变为2-xyz1234567890abc
,然后返回成功响应。 - 如果不一致,说明在获取文档后,其他客户端已对该文档进行了更新,CouchDB会返回一个HTTP 409冲突错误,提示客户端需要重新获取最新版本的文档,再进行更新操作。例如:
HTTP/1.1 409 Conflict { "error": "conflict", "reason": "Document update conflict." }
- 如果一致,CouchDB会更新文档,并生成一个新的
客户端收到冲突错误后,需要再次获取文档,根据新的_rev
重新发起更新请求。