面试题答案
一键面试处理文档冲突的代码实现思路
- 使用乐观并发控制:在CouchDB中,每次文档更新都会生成一个新的
_rev
(修订版本号)。通过在创建文档时提供_rev
参数,并根据返回的HTTP状态码处理冲突。如果状态码为409 Conflict
,则获取最新的_rev
,重新尝试创建或更新。 - 重试机制:结合错误处理机制,当遇到冲突时,捕获异常并进行重试操作。可以设置重试次数和重试间隔时间,避免无限重试。
示例代码(以Python为例,使用requests
库)
import requests
import time
url = 'http://localhost:5984/your_database_name'
data = {
"key": "value"
}
max_retries = 3
retry_delay = 1 # 重试间隔1秒
for attempt in range(max_retries):
try:
response = requests.post(url, json=data)
response.raise_for_status() # 检查HTTP状态码
print(f"Document created successfully: {response.json()}")
break
except requests.exceptions.HTTPError as err:
if err.response.status_code == 409:
# 获取最新的 _rev
latest_rev = err.response.json()['_rev']
data['_rev'] = latest_rev
print(f"Conflict detected, retrying attempt {attempt + 1}...")
time.sleep(retry_delay)
else:
print(f"An error occurred: {err}")
HTTP方法及参数设置
- HTTP方法:使用
POST
方法来创建新文档。 - 参数设置:
- 请求体:包含要创建的文档数据,格式为JSON。例如:
{"name": "John", "age": 30}
Content-Type
:设置为application/json
,表示请求体的数据格式。Accept
:设置为application/json
,期望响应的数据格式为JSON。If-Match
:在更新已有文档时,设置为文档的当前_rev
值,用于乐观并发控制。例如:If-Match: "1-abcdef123456"
。在创建文档时一般不需要设置,但在处理冲突后的重试时会用到。
- 请求体:包含要创建的文档数据,格式为JSON。例如:
通过以上方式,在代码实现层面能够有效处理CouchDB创建文档时的冲突,符合最佳实践。