es 的数据并发更新的处理,采用乐观锁的方式。
我现在学习使用的版本是 7.11
数据更新有两种:1 覆盖更新;2 部分更新。
在处理并发时,我发现这两种方式使用的参数是不一样的。
首先创建索引
DELETE student-001
PUT student-001
{"settings":{"number_of_shards":3},"mappings":{"properties":{"id":{"type":"long"},"name":{"type":"text","fields":{"key":{"type":"keyword"}}},"age":{"type":"integer"},"year":{"type":"integer","fields":{"key":{"type":"keyword"}}}}}}
添加数据
PUT student-001/_doc/1
{
"id": 1,
"name": "student-1",
"year": 1
}
数据更新
1 覆盖更新
POST student-001/_doc/1?version_type=external&version=25
{
"name": "student-12"
}
使用的参数是: version_type=external&version=25
version 可以查出来
需要注意的是,入参的version 的值要比查出来的 version 的值在大
2 部分更新
POST student-001/_update/1?if_seq_no=22&if_primary_term=1
{
"doc": {
"name": "student-123"
}
}
使用的参数是: if_seq_no=22&if_primary_term=1
需要注意的是,入参的 if_primary_term 的值,要比查出来的值 _primary_term 大,否则会更新不成功。
查询数据的时候,可以添加参数来获取 verion、 _seq_no、_primary_term 等相应的字段
GET student-001/_search?version=true&seq_no_primary_term=true