springBootservice事务注解@Transactional的⽤法springBoot使⽤事物
⼀:⾸先确保使⽤的mysql为InnoDB⽀持事务,否则代码在怎么改都⽆法实现事务回滚操作。
场景分析:
1.默认spring事务只在发⽣未被捕获的 RuntimeException 时才回滚。
2.spring aop 异常捕获原理:被拦截的⽅法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到⽅法的异常,才能进⾏回滚,默认情况下aop只捕获 RuntimeException 的异常,但可以通过配置来捕获特定的异常并回滚 ,换句话说在service的⽅法中不使⽤try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进⽽回滚。
springboot aop事务写法分为三种:
1.⼿动回滚。给注解加上参数如:@Transactional(rollbackFor=Exception.class)。
2.MyException改为继承RuntimeException的异常。并且在service上层要继续捕获这个异常并处理。
3.在service层⽅法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollb
ackOnly();语句,⼿动回滚,这样上层就⽆需去处理异常。
代码实例参考:
@Transactional
@Override
public double rewareVideoGifts(VideoGiftsParam videoGiftsParam) {
try {
Gifts gifts=giftMapper.GiftsId());
videoGiftsParam.setGifts_Gifts_price());
//计算花费总⾦币数
videoGiftsParam.setTotal_Gifts_price()*((Amount()));
Live_app_user_info live_app_user_info=giftMapper.UserId());
live_app_user_info.setUser_package(live_app_User_package()-Total_gold()); //扣除⽤户⾦币
int result=giftMapper.updateUserGolds(live_app_user_info);
Video_gifts video_gifts=giftMapper.selVideoGifts(videoGiftsParam);
if(video_gifts!=null) {
//累加礼物数量和总⾦额
giftMapper.updateVideoGiftsAmount(videoGiftsParam);
}else {
//新增礼物
giftMapper.insVideoGifts(videoGiftsParam);
}
//获取⽤户的利润分成
double profit=giftMapper.VideoUserId());
videoGiftsParam.setUser_Total_gold()*profit);
//⽤户积分增加
Live_app_user_info live_app_user_info2=giftMapper.VideoUserId());
live_app_user_info2.setUser_score(live_app_User_score()+User_score()); int resultset=giftMapper.updateUserScore(live_app_user_info2);
if(result<=0 || resultset<=0) {
//事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return -1;
}
//返回⽤户剩余⾦币
return live_app_User_package();
} catch (Exception e) {
//事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return -1;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论