重试机制

针对乐观锁的重试机制我分成以下几个步骤来实现:

  1. 自定义注解
  2. 给注解添加aop切面,在around中添加业务处理;
  3. 给serviceImpl添加注解

自定义注解

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CustomRetry {//重试次数 ,这里默认15int value() default 15;
}

简单介绍一下这几个注解的意思:
@Target 表示这个注解作用的范文,这里是作用到方法和类上面;
@Retention标志这个注解的生命周期,这里是在运行时;
@Document 表示可以被文档化;

自定义异常

public class TryAgainException extends RuntimeException  {public TryAgainException(String  e) {super(e);}
}

添加aop切面

添加pointCut ;

/*** 定义切点*/@Pointcut("@annotation(com.ht.erp.annotations.CustomRetry)")private void customRetryPointCut() {}

添加around 环绕通知

 @Around("customRetryPointCut()&& @annotation(customRetry)")@Transactional(rollbackFor = Exception.class)public Object retry(ProceedingJoinPoint joinPoint, CustomRetry customRetry) throws Throwable {int count = 0;do {count++;try {log.info("重试次数:{}", count);return joinPoint.proceed();} catch (TryAgainException e) {if(count>=customRetry.value()){TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();throw new TryAgainException("重试失败");}}}while (true);}

在serviceImpl上添加CustomRetry自定义注解,并针对版本号不一致时抛出我们自定义的异常;

 @Transactional(rollbackFor = TryAgainException.class)@CustomRetrypublic void mult(int id) {GoodsIn goodsIn = goodsInMapper.getGoodInById(id);log.info("版本号version:" + goodsIn.getVersion());goodsIn.setTotalNumber(goodsIn.getTotalNumber() - 1);int i = goodsInMapper.updateGoodIn(JSON.parseObject(JSON.toJSONString(goodsIn), Map.class));if(i==0){throw  new TryAgainException("更新异常,版本号不一致");}}

接下来我用jmeter发送70个并发请求测试一下,我们发现当出现版本号异常时就会出发重试。

超过了我们的重试次数之后,就会执行我定义的抛出异常;

以上只是个demo。具体业务还需具体处理;

springboot 乐观锁重试机制相关推荐

  1. mybatis-plus乐观锁重试机制配置重置次数

    1.项目结构 2.定义异常类 2.1 ApiResultEnum类 package com.example.springbootmybatisplus.common;public enum ApiRe ...

  2. mysql乐观锁重试_乐观锁失败重试

    1.乐观锁失败后会报:ObjectOptimisticLockFailureException 2.处理方案:捕获到对应乐观锁失败异常后进行重试,代码参考如下 在写入数据库的时候需要有锁,比如同时写入 ...

  3. mysql乐观锁重试_乐观锁加重试,并发更新数据库一条记录导致:Lock wait timeout exceeded...

    背景: mysql数据库,用户余额表有一个version(版本号)字段,作为乐观锁. 更新方法有事务控制: @Transactional(rollbackFor = Exception.class) ...

  4. **Java有哪些悲观锁的实现_面试4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点?...

    推荐阅读: 数据库面试4连问:分库分表,中间件,优缺点,如何拆分? 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够? 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗? 01 乐观锁 ...

  5. 通俗易懂 高并发案例春节抢红包分析 乐观锁 悲观锁 分布式锁

    今年春节响应国家号召在家宅着抵抗疫情,拜年也改用微信红包,春节发了很多也抢了很多微信红包,也算支持了公司业务,微信支付融入生活,抢红包已经是非常平常的事情,想到WXG的小伙伴丰厚的年终奖我柠檬了. 抢 ...

  6. 乐观锁与悲观锁的概念、实现方式、场景、优缺点?

    01 乐观锁与悲观锁的基本概念 何为乐观锁与悲观锁? 答:乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展.这两种人各有优缺点,不能不以场景而 ...

  7. Java 中的悲观锁和乐观锁的实现

    锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...

  8. java中乐观锁_Java中乐观锁与悲观锁的实现

    锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...

  9. 乐观锁与悲观锁的应用场景

    锁( locking )         业务逻辑的实现过程中.往往须要保证数据訪问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行 ...

最新文章

  1. 鸟哥的linux私房菜内容,《鸟哥的linux私房菜》学习笔记 权限
  2. [转]调试AngularJS应用
  3. 小米真蓝牙耳机说明书_媲美AirPods?小米真无线蓝牙耳机Air 2开箱
  4. 几何画板自定义工具_用好神奇的数学工具--几何画板,轻松作出复杂的几何图形...
  5. Expo大作战(十二)--expo中的自定义样式Custom font,以及expo中的路由RouteNavigation
  6. RequireJS模块化之循环依赖
  7. 开课吧python小课学了有用吗-Python学得好,升职加薪下班早
  8. python语言数字类型字节_Python中 各种数字类型的判别(numerica, digital, decimal)
  9. Linux备份数据 结果为0 原因:mysqldump command not found
  10. VS2013 配置wincap开发环境
  11. 信号系统服务器,轨道交通信号系统知识介绍
  12. postcss-pxtorem使用方式
  13. 前端该如何评估开发时间
  14. 对于计算机网络的感想,计算机网络实习心得
  15. 2015年上半年系统集成项目管理工程师案例计算题精讲(乔俊峰)-乔俊峰-专题视频课程...
  16. H5高仿淘宝(html模板)
  17. Reverse and Concatenate
  18. 安卓开发之利用contentprovider进行数据获取
  19. php公钥私钥使用,PHP实现公钥加密私钥解密机制
  20. “互联网+”大学生创新创业大赛产业命题赛道命题方向分析

热门文章

  1. css3网站代码 html5_网站布局、排版优秀的HTML5+CSS3网页设计
  2. 关于等价无穷小在加减运算中的应用
  3. LSTM估计股票收盘价
  4. 商业源码网 java_java新闻发布系统JAVA商业源码下载
  5. 日本家用计量器电子秤认证,日本正认证,日本电子秤认证
  6. Linux软件安装卸载(yum+rpm)
  7. WordPress 头像修改【转载】
  8. 重节点对B样条曲线的影响
  9. NLP自然语言处理实战(三):词频背后的语义--5.距离和相似度反馈及改进
  10. 育种数据分析之放飞自我----关注数1万+的感言