SpringBoot之MySQL数据的丢失的元凶--事务(转)

因为当时是跑定时任务去插入数据,大概是这样的

//简单的定时任务,30分钟执行一次
@Scheduled(cron = "0 0/30 * * * ?")
public void dealInsertUserInfo(){
userService.dealInsertUserInfo();
}
事后也没太注意它是否插入数据正常,直到第二天,有同事提出问题然后才发现表id自增到2000多了,数据一条都没有,尴尬!!!其实一般使用SpringBoot开发的都知道我们比较喜欢使用注解,一般会在service层加一个事务注解:@Transactional,毕竟可以根据不同的事务的隔离级别实现不同的功能,例如防止脏读、不可重复读以及幻读。但是事务失败则通过调用rollback()方法进行回滚,然后我的数据呢,就被它无情的吞掉了,然后我就shanlita

事务回滚必要条件

1.方法拦截——方法或者方法所在类被@Transactional注解
2.
异常——该方法的执行过程出现异常,事务管理器被触发,并对此做出处理
3.
指定异常——默认配置下,事务只会对Error与RuntimeException及其子类这些UNChecked异常,做出回滚。 一般的Exception这些Checked异常不会发生回滚(如果一般Exception想回滚要做出配置) 

举个栗子:实现一般异常的回滚: 
注解式:@Transactional(rollbackFor=Exception.class)

4.异常抛出——方法中出现的指定异常,只有在被事务管理器捕捉到以后,事务才会据此进行事务回滚,比如:
   a.异常不捕捉,就会回滚 
   b.如果异常被try{}捕捉到,那么事务管理器就无法再捕捉异常,所以就无法做出反应,事务不回滚;(既catch(RuntimeException)) 
   c.如果异常被try{}捕捉了,我们还可以在Catch(){}中throw new RuntimeException(),手动抛出运行时异常供事务管理器捕捉;(既catch(){ throw new RuntimeException(); })
   d.手动回滚事务TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

关闭自动事物回滚,使用@Rollback(false)关闭回滚。
 
————————————————
版权声明:本文为CSDN博主「ZBYTSL」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ZBYTSL/article/details/102833922

原文地址:https://www.cnblogs.com/xiaohanlin/p/12195488.html