简介:剖析elastic search的乐观锁
锁的简单分类
悲观锁 顾名思义,就是很悲观,每次去拿数据的时候都认为别⼈会修改,所以每次在拿数据的时候都会上锁,这样别⼈想拿这个数据就会阻塞,直到它拿到锁。传统的关系型数据库⾥边就⽤到了很多这种锁机制,⽐如⾏锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别⼈不会修改,所以不会上锁,但是在更新的时候会判断⼀下在此期间别⼈有没有去更新这个数据,⽐如可以使⽤版本号等机制。乐观锁适⽤于多读的应⽤类型,这样可以提⾼吞吐量,因为我们elasticsearch⼀般业务场景都是写少读多,所以通过乐观锁可以在控制并发的情况下⼜能有效的提⾼系统吞吐量。
版本号乐观锁
Elasticsearch 中对⽂档的 index , GET 和 delete 请求时,都会返回⼀个 _version,当⽂档被修改时版本号递增。所有⽂档的更新或删除 API,都可以接受 version 参数,这允许你在代码中使⽤乐观的并发控制,这⾥要注意的是版本号要⼤于旧的版本号,并且加上version_type=external。获取⽂档
GET /nba/_doc/1
{
"_index": "nba",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_seq_no": 4,
"_primary_term": 7,
"found": true,
"_source": {
"name": "哈登",
"team_name": "⽕箭",
"position": "得分后卫",
"play_year": "10",
"jerse_no": "13"
}
}
通过版本号新增⽂档(version要⼤于旧的version)
POST /nba/_doc/1?version=2&version_type=external
{
"name": "哈登",
"team_name": "⽕箭",
"position": "得分后卫",
"play_year": "10",
"jerse_no": "13"
}