es乐观锁,
1 必须更新文档信息,version版本才会自动增加
2 version版本同时被两个线程拿到,但是只有一个线程能将verson版本修改成功,所以达到乐观锁的目的
例:thread1 version 4->5
thread2 version 4->5
两个只有一个能修改成功
/**
* es乐观锁方法
* @param datapacketId
*/
private void getESLock(String datapacketId) {
//创建更新请求
GetRequest getRequest = new GetRequest(DhsConstant.INDEX_NAME_DATAPACKET, DhsConstant.INDEX_NAME_DATAPACKET, datapacketId);
RestHighLevelClient client = esTemplate.getClient();
try {
// 执行 GET 请求获取文档信息
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
long version = 0;
//获取版本号
if (getResponse.isExists()) {
version = getResponse.getVersion();
}
// 创建更新请求
UpdateRequest updateRequest = new UpdateRequest(DhsConstant.INDEX_NAME_DATAPACKET, DhsConstant.INDEX_NAME_DATAPACKET, datapacketId);
// 设置版本信息+1
version++;
//更新文档里面的版本字段
JSONObject jsonObject = new JSONObject();
jsonObject.put(DhsConstant.VERSION, version);
// 创建要更新的文档内容
String jsonString = jsonObject.toJSONString();
updateRequest.doc(jsonString, XContentType.JSON);
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
// 设置版本信息
updateRequest.version(version);
updateRequest.versionType(VersionType.EXTERNAL);
} catch (Exception e) {
//如果已经有一个更新版本信息直接return即可
return;
}
}