前言
并发控制,一般有两种方案,悲观锁和乐观锁,其中悲观锁是默认每次更新操作肯定会冲突,所以每次操作都要先获取锁,操作完毕再释放锁,适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突,所以在更新前和更新后都不需要获取锁和释放锁的操作,所以效率更高,适合于读多写少的场景中。
在es中采用的是乐观锁机制,这也很好理解,因为es的定位是一个搜索引擎,所以一般是应用于读多写少的场景中。
es的乐观锁机制
1. 每次更新文档的version都会+1(这种方式已废弃)
2. 内部版本号控制,通过if_seq_no+if_primary_term
3. 外部版本号控制,version+verion_type=exeternal,其中verison由外部数据源指定,如数据从MySQL同步
查询的时候展示:
更新后:
修改固定值报错:
代码
java
User user = new User();
user.setAge(27);
user.setName("赵六7");
user.setInfo("测试人员查询");
user.setSex("男");
GetResponse<User> getResponse = elasticsearchClient.get(e -> e.index("user_test").id("3"), User.class);
Long version = getResponse.version();
Long seqNo = getResponse.seqNo();
Long primaryTerm = getResponse.primaryTerm();
System.out.println("更新前的version"+version+"更新前的seqNo"+seqNo+"更新前的primayTerm"+primaryTerm);
// 修改带着版本号
UpdateResponse<User> updateResponse = elasticsearchClient.update(e -> e.index("user_test").id("3").doc(user).ifSeqNo(seqNo).ifPrimaryTerm(primaryTerm), User.class);
GetResponse<User> getResponse2 = elasticsearchClient.get(e -> e.index("user_test").id("3"), User.class);
Long version2 = getResponse2.version();
Long seqNo2 = getResponse2.seqNo();
Long primaryTerm2 = getResponse2.primaryTerm();
System.out.println("更新后的version"+version2+"更新后的seqNo"+seqNo2+"更新后的primayTerm"+primaryTerm2);