ES是基于乐观锁进行并发控制的。
如果有并发的业务场景,可以直接使用ES内置乐观锁机制。
使用的时候,java程序需要先Get指定的记录,获取到版本号,然后Put的时候,带着该版本号,请求更新。
ES只有判断到 该记录的 version = 请求中的version值 时,才能进行更新。如果不相等,则舍弃。
下面演示如何使用乐观锁:
1、 先创建一条记录,此时ES返回信息中会有标识: version=1
PUT /test_index/test_type/1
{
"f1":"test f1"
}
2、带着version=1执行Put更新,能更新成功
PUT /test_index/test_type/1?version=1
{
"f1":"test Client 2"
}
3、另一个客户端也在同时做了Get查询,得到version=1,此时它带着version=1执行put时,会报错:version不一致。即使大于也不行
PUT /test_index/test_type/1?version=1
{
"f1":"test Client 3"
}
4、出现这种情况后,java程序应再次Get一次,得到新的版本号
GET /test_index/test_type/1
5、 再发起一次请求,带着刚得到的版本号。此时能更新成功
PUT /test_index/test_type/1?version=2
{
"f1":"test Client 3"
}
-----------------------------------------------------External 锁------------------------------------------------------------------------------------------
1. 使用external锁的时候,ES判断,只要请求的version值 > 实际记录的version值,即可更新。等于的话,更新失败
PUT /test_index/test_type/2
{
"f1":"test f1"
}
PUT /test_index/test_type/2?version=2&version_type=external
{
"f1":"test f2"
}