我是靠谱客的博主 阳光香水,这篇文章主要介绍最佳实践-轻量级事务编程(绕开事务失效的坑)1、代码中开启事务常见问题2、推荐方案3、总结,现在分享给大家,希望可以做个参考。

1、代码中开启事务常见问题

现象:方法加了@Transactional,同类中方法调用,事务未生效。

原因:采用Spring aop注解事务方式,同类中方法调用不会进入AOP拦截。

2、推荐方案

  1、定义动作执行接口

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
@FunctionalInterface public interface IActionService { /** * 动作执行接口 * 事务 多线程 等可以封装 * */ void doAction(); } 2、定义事务拦截服务类
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/** * 事务处理 * @author peter * */ @Transactional @Service public class TransactionService { /** * 执行事务代码 */ public void service(IActionService transaction) { transaction.doAction(); } } 3、项目中lambda表达方式方式应用
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
transactionService.service(() -> { // 这当中是事务处理 // 计算积分 考虑加速 Integer points = pointGiveService.reducePoints(current); // 考虑并发 做增量更新 McMemberInfo updateMi = new McMemberInfo(); updateMi.setId(mi.getId()); updateMi.setMemberLevelCode(finalMemberLevel.getMemberLevelCode());// 等级编码 updateMi.setLevelAlias(finalMemberLevel.getMemberLevelName());// 等级别名 updateMi.setLevelAliasName(finalMemberLevel.getMemberLevelNickName());// 等级中文别名 updateMi.setCurrentGrowthValue(levelInfo.getGrowthValue() - mi.getCurrentGrowthValue());// 成长值更新 增量 updateMi.setCurrentRatingValue(levelInfo.getLevelValue() - mi.getCurrentRatingValue());// 定级值更新 增量 updateMi.setCurrentApplePoints(0 - points);// 更新苹果积分 扣减积分 增量 updateMi.setUpdated(DateUtil.currentDate());// 更新日期 updateMi.setLevelDueDate(getLevelDueDate(conf));// 设置等级到期日 // 增量更新 memberInfoService.updateWithIncre(updateMi); // 中间锁状态 调整为最终锁状态 即已处理状态 lockMiddleToFinalStatus(current.getNumber()); });

3、总结

在第二部分中的第一、第二步固定,第三步根据实际业务处理。

通过这种方式规避同类中无事务A方法调用有事务B方法,B方法事务未走拦截开启的问题。且解决另起事务类并定制参数方法的编程方式。

最后

以上就是阳光香水最近收集整理的关于最佳实践-轻量级事务编程(绕开事务失效的坑)1、代码中开启事务常见问题2、推荐方案3、总结的全部内容,更多相关最佳实践-轻量级事务编程(绕开事务失效内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部