elastic update Java API版本冲突,导致并发锁异常问题

概述

1 elastic update 在修改这条数据的的过程中(这个过程指的是 数据库执行update 到 事务提交的过程中 )为这条数据加上 写锁,阻止 别的事务 对锁定数据的修改!
请求后一个修改事务的线程阻塞,直到前一个事务的完成,所以针对这条数据的 2 个修改 是一个一个来的。所以 elastic的 update t1 set a = a+1; 这样的操作 不会导致 a数据的 丢失,因为前一个事务 执行的时候回阻塞后一个事务提交数据。 但是 如果先查询出a=1, 然后 a = 1(这个1 是查询到的 a)+1 ;这样的操作会 丢失 a ,因为 a 两个事务查询的a 可能 会被修改了。

2 elastic 拒绝 第二个事务来修改 已经被修改但是未被提交的数据(事务未提交)。 es 的全更新 不会有自动检索 的过程,直接替换,可以通过version 控制并发。部分更新有自动检索的过程 ,并发修改冲突会重新检索,带上version然后重新新构建索引
重试 retry_on_conflict 次后会抛出异常,并且 也可以通过 version 控制(retry_on_conflict 默认0 次 相当于 自动带上了version,但是不完成等价 , 因为 version 读的 时机 不同,有些情况可能 不同的结果,主要肯写法 和 业务 情景 比如 a = a+1 就没影响,但是 a = 1+1 就有影响,可以细细体会 一下,挺有意思的 )。

异常

version conflict, current version [x] is different than the one provided [xx]

JAVA 具体修改DEMO

Map<String, Object> condition = new HashMap<>();
condition.add("username", "green");
condition.add("age", 10);
condition.add("br", "1992-06-09");
UpdateResponse response = transportClient.prepareUpdate(index, type, id)
 //此处是 elastic 发生版本冲突!error  version conflict, current version
 //TODO 重要 使用RetryOnConflict 处理此方法!
.setRetryOnConflict(100).setDoc(condition).get();
 Integer success = response.getShardInfo().getSuccessful();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值