结论
先查操作之前当前数据的_seq_no,_primary_term值比如各自是0和1
在更新的时候url带上if_seq_no=0&if_primary_term=1
指明只有在这个值的情况下才进行更新,否则返回错误
案例
步骤1:测试数据添加
website/blog/1/_create
{
"title": "My first blog entry",
"text": "Just trying this out..."
}
返回值会有一个_seq_no和_primary_term字段
"_seq_no": 0,
"_primary_term": 1
步骤2:并发控制
获取数据
website/blog/1
返回值
{
"_index": "website",
"_type": "blog",
"_id": "1",
"_version": 1,
"_seq_no": 0, // 注意看这里
"_primary_term": 1,// 注意看这里
"found": true,
"_source": {
"title": "My first blog entry",
"text": "Just trying this out..."
}
}
步骤3:进行更新数据加上条件
website/blog/3?if_seq_no=0&if_primary_term=1
大概意思就是只有if_seq_no和if_primary_term等于我们的值的时候才进行更新
重复操作会报
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[3]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [3] and primary term [1]",
"index_uuid": "hqx20LnrTgiOykvXMLw-dQ",
"shard": "0",
"index": "website"
}
],
"type": "version_conflict_engine_exception",
"reason": "[3]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [3] and primary term [1]",
"index_uuid": "hqx20LnrTgiOykvXMLw-dQ",
"shard": "0",
"index": "website"
},
"status": 409
}
注意
对于es的修改都是无序的,可能会造成并发的一些问题。
这时我们在操作es的时候可以通过_seq_no这个es自带的字段进行控制
注意:一些老的版本es使用version,但是新版本不支持了,会报这个错误,提示我们用if_seq_no和if_primary_term
{
"error": {
"root_cause": [
{
"type": "action_request_validation_exception",
"reason": "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;"
}
],
"type": "action_request_validation_exception",
"reason": "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;"
},
"status": 400
}