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

mac2024-03-30  31

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

//简单的定时任务,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)关闭回滚。

 

最新回复(0)