springboot 乐观锁重试机制
重试机制
针对乐观锁的重试机制我分成以下几个步骤来实现:
- 自定义注解
- 给注解添加aop切面,在around中添加业务处理;
- 给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 乐观锁重试机制相关推荐
- mybatis-plus乐观锁重试机制配置重置次数
1.项目结构 2.定义异常类 2.1 ApiResultEnum类 package com.example.springbootmybatisplus.common;public enum ApiRe ...
- mysql乐观锁重试_乐观锁失败重试
1.乐观锁失败后会报:ObjectOptimisticLockFailureException 2.处理方案:捕获到对应乐观锁失败异常后进行重试,代码参考如下 在写入数据库的时候需要有锁,比如同时写入 ...
- mysql乐观锁重试_乐观锁加重试,并发更新数据库一条记录导致:Lock wait timeout exceeded...
背景: mysql数据库,用户余额表有一个version(版本号)字段,作为乐观锁. 更新方法有事务控制: @Transactional(rollbackFor = Exception.class) ...
- **Java有哪些悲观锁的实现_面试4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点?...
推荐阅读: 数据库面试4连问:分库分表,中间件,优缺点,如何拆分? 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够? 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗? 01 乐观锁 ...
- 通俗易懂 高并发案例春节抢红包分析 乐观锁 悲观锁 分布式锁
今年春节响应国家号召在家宅着抵抗疫情,拜年也改用微信红包,春节发了很多也抢了很多微信红包,也算支持了公司业务,微信支付融入生活,抢红包已经是非常平常的事情,想到WXG的小伙伴丰厚的年终奖我柠檬了. 抢 ...
- 乐观锁与悲观锁的概念、实现方式、场景、优缺点?
01 乐观锁与悲观锁的基本概念 何为乐观锁与悲观锁? 答:乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展.这两种人各有优缺点,不能不以场景而 ...
- Java 中的悲观锁和乐观锁的实现
锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...
- java中乐观锁_Java中乐观锁与悲观锁的实现
锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...
- 乐观锁与悲观锁的应用场景
锁( locking ) 业务逻辑的实现过程中.往往须要保证数据訪问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行 ...
最新文章
- 鸟哥的linux私房菜内容,《鸟哥的linux私房菜》学习笔记 权限
- [转]调试AngularJS应用
- 小米真蓝牙耳机说明书_媲美AirPods?小米真无线蓝牙耳机Air 2开箱
- 几何画板自定义工具_用好神奇的数学工具--几何画板,轻松作出复杂的几何图形...
- Expo大作战(十二)--expo中的自定义样式Custom font,以及expo中的路由RouteNavigation
- RequireJS模块化之循环依赖
- 开课吧python小课学了有用吗-Python学得好,升职加薪下班早
- python语言数字类型字节_Python中 各种数字类型的判别(numerica, digital, decimal)
- Linux备份数据 结果为0 原因:mysqldump command not found
- VS2013 配置wincap开发环境
- 信号系统服务器,轨道交通信号系统知识介绍
- postcss-pxtorem使用方式
- 前端该如何评估开发时间
- 对于计算机网络的感想,计算机网络实习心得
- 2015年上半年系统集成项目管理工程师案例计算题精讲(乔俊峰)-乔俊峰-专题视频课程...
- H5高仿淘宝(html模板)
- Reverse and Concatenate
- 安卓开发之利用contentprovider进行数据获取
- php公钥私钥使用,PHP实现公钥加密私钥解密机制
- “互联网+”大学生创新创业大赛产业命题赛道命题方向分析