我是靠谱客的博主 阳光香水,最近开发中收集的这篇文章主要介绍最佳实践-轻量级事务编程(绕开事务失效的坑)1、代码中开启事务常见问题2、推荐方案3、总结,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
1、代码中开启事务常见问题
现象:方法加了@Transactional,同类中方法调用,事务未生效。
原因:采用Spring aop注解事务方式,同类中方法调用不会进入AOP拦截。
2、推荐方案
1、定义动作执行接口
@FunctionalInterface
public interface IActionService {
/**
* 动作执行接口
* 事务 多线程 等可以封装
*
*/
void doAction();
}
2、定义事务拦截服务类
/**
* 事务处理
* @author peter
*
*/
@Transactional
@Service
public class TransactionService {
/**
* 执行事务代码
*/
public void service(IActionService transaction) {
transaction.doAction();
}
}
3、项目中lambda表达方式方式应用
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、总结的全部内容,希望文章能够帮你解决最佳实践-轻量级事务编程(绕开事务失效的坑)1、代码中开启事务常见问题2、推荐方案3、总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复