@Transactional public void updateBatchById(Schedule schedule) { Schedule scheduleOld = dao.getById(schedule.getId()); schedule.setCron(scheduleOld.getCron()); schedule.setClassName(scheduleOld.getClassName()); schedule.setMethodName(scheduleOld.getMethodName()); List<Schedule> scheduleList = new ArrayList<>(); scheduleList.add(schedule); // 删除数据库里的任务 dao.updateBatchById(scheduleList); throw new RuntimeException("yichang"); /* // 停止定时任务 scheduleList.stream().forEach(item -> { taskBizService.removeSchedule(item); });*/ } 数据库为什么不回滚
时间: 2023-07-16 14:11:31 浏览: 54
根据你提供的代码,我看不出来具体的原因,但是可能是因为你没有开启事务。事务是保证一组数据库操作的原子性、一致性、隔离性和持久性的机制。如果在事务中发生异常,所有的操作会被回滚,就好像什么都没有发生过一样。
你可以在方法上添加 @Transactional 注解来开启事务。如果你已经添加了 @Transactional 注解,并且仍然无法回滚,请确保你的事务管理器配置正确,例如使用了正确的事务管理器类型和配置了事务管理器的属性。
相关问题
@Transactional public void updateBatchById(Schedule schedule) { Schedule scheduleOld = dao.getById(schedule.getId()); schedule.setCron(scheduleOld.getCron()); schedule.setClassName(scheduleOld.getClassName()); schedule.setMethodName(scheduleOld.getMethodName()); List<Schedule> scheduleList = new ArrayList<>(); scheduleList.add(schedule); // 删除数据库里的任务 dao.updateBatchById(scheduleList); throw new RuntimeException("yichang"); /* // 停止定时任务 scheduleList.stream().forEach(item -> { taskBizService.removeSchedule(item); });*/ }
这段代码是一个使用@Transactional注解的更新批量任务的方法。在该方法中,先通过指定的id获取要更新的任务,然后将其它属性设置为旧任务的属性,接着将新任务添加到列表中并通过dao.updateBatchById()方法更新到数据库中。最后,通过抛出RuntimeException来模拟方法出现异常。
需要注意的是,在该方法中注释掉了停止定时任务的代码,如果需要停止定时任务,可以将注释去掉。
阅读全文