Java Spring Boot@Scheduled不适用于数据库事务

Java Spring Boot@Scheduled不适用于数据库事务,java,spring-boot,Java,Spring Boot,我有一个预定的工作,将删除数据库中的所有记录,并插入新的数据,每10分钟。如果我通过创建一个web服务来手动调用该服务,这将非常有效。但是,计划作业无法删除和插入。我使用JPA删除所有记录并保存。我也维护了@Transactional注释,但到目前为止运气不好。有什么想法吗 @Service public class ScheduledService { @Autowired MainService mainService; @Scheduled(fixedDelay

我有一个预定的工作,将删除数据库中的所有记录,并插入新的数据,每10分钟。如果我通过创建一个web服务来手动调用该服务,这将非常有效。但是,计划作业无法删除和插入。我使用JPA删除所有记录并保存。我也维护了@Transactional注释,但到目前为止运气不好。有什么想法吗

@Service
public class ScheduledService {

    @Autowired
    MainService mainService;

    @Scheduled(fixedDelay=100000, initialDelay=10000)
    public void updateAllScreensScheduled() {
        mainService.updateAllScreens();
    }
}
My MainService.java

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateAllScreens() {
   tSerScheduleJpaRepository.deleteAll();   // delete all schedule data
   List<ScheduleData> scArr = getFreshData();   // get all schedule data            
   List<TSerScheduleEntity> list= new ArrayList<>();
            for (ScheduleData scheduleData : scArr) {
                TSerScheduleEntity entity = new TSerScheduleEntity();
                entity.setRtNm(scheduleData.getRtNm());
                list.add(entity);
            }
            tSerScheduleJpaRepository.save(list);   // save schedule data
        }
@Transactional(传播=传播。需要\u NEW)
public void updateAllScreens(){
tSerScheduleJpaRepository.deleteAll();//删除所有计划数据
List scArr=getFreshData();//获取所有计划数据
列表=新的ArrayList();
for(ScheduleData ScheduleData:scArr){
TSerScheduleEntity=新的TSerScheduleEntity();
entity.setRtNm(scheduleData.getRtNm());
列表。添加(实体);
}
tSerScheduleJpaRepository.save(list);//保存计划数据
}

最后,我通过以下方式解决了这个问题:

  • 在应用程序类中添加了
    @EnableTransactionManagement
    ,还添加了
    PlatformTransactionManager
    Bean。检查以下代码:
  • 以下是进口商品:

    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
  • 在我的计划程序代码中添加了以下代码:

  • 希望这能解决您的问题:)

    我通过使用主体
    mainService.updateAllScreens()创建一个带有
    @Async
    注释的方法,解决了这个问题updateAllScreens()

    因此,
    updateAllScreensScheduled()
    看起来就像是对异步方法的调用


    注意:别忘了将
    @enablesync
    添加到配置中

    您会遇到什么错误?没有错误,一切看起来都很好..但是数据没有保存在数据库中。是否调用了方法
    updateAllScreensScheduled()
    ?您是否在某处启用了
    @EnableScheduling
    ?是的,在调试模式下进行了测试,所有操作都已执行。我在spring boot主类中保留了@EnableScheduling。您是否尝试过不使用
    propagation=propagation。在
    @事务中需要\u NEW
    ?这没有帮助
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @Scheduled(fixedRate = 60 *10*1000)
        @Transactional(propagation=Propagation.REQUIRES_NEW)
        public void reportCurrentTime() {
        doDatabaseTransaction();
        }
    
    Here is the imports :
    
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Controller;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;