1._version元数据
当我们进行数据操作的时候,可以看到返回的结果中有_version,例如
GET /test_index/test_type/2
结果:
{
"_index": "test_index",
"_type": "test_type",
"_id": "2",
"_version": 4,
"found": true,
"_source": {
"test_field": "xxx0",
"test_field2": "xxx02"
}
}
第一次新建时,_version为1,后面每次进行删改操作,_version自增1
POST /test_index/test_type/2
{
"test_field":"xxx00"
}
结果:
{
"_index": "test_index",
"_type": "test_type",
"_id": "2",
"_version": 5,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 1
}
如果进行删除然后继续新增,
删除操作,_version自增1
PUT操作,_version重置为1
DELETE /test_index/test_type/2
结果
{
"_index": "test_index",
"_type": "test_type",
"_id": "2",
"_version": 6,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 5,
"_primary_term": 1
}
重新新建PUT,_version又是从1开始
PUT /test_index/test_type/2
{
"test_field":"xxxxx000"
}
结果:
{
"_index": "test_index",
"_type": "test_type",
"_id": "2",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 6,
"_primary_term": 1
}
2.基于external version进行乐观锁并发控制
es提供了一个feature,就是说,你可以不用它提供的内部_version版本号来进行并发控制,可以基于你自己维护的一个版本号来进行并发控制。举个列子,假如你的数据在mysql里也有一份,然后你的应用系统本身就维护了一个版本号,不管是什么自己生成的还是程序控制的。这个时候,你进行乐观锁并发控制的时候,可能并不是想要用es内部的_version来进行控制,而是用你自己维护的那个version来进行控制。
......?version=1
......?version=1&version_type=external
version_type=external唯一的区别在于:_version,只有当你提供的version与es中的_version一模一样的时候,才可以进行修改,只要不一样,就报错;当version_type=external的时候,只有当你提供的version比es中的_version大的时候,才能完成修改。