Scheduler,CrudRepository和TransactionRequiredException

问题描述 投票:1回答:1

我有一个CrudRepository和一个删除数据的方法:

public interface SampleRepository extends PagingAndSortingRepository<Sample, String> {

    @Modifying
    @Transactional
    @Query("delete from Sample where creationTimestamp <= ?1")
    public void deleteOutdatedData(Instant expirationTimestamp);
}

如果我使用休息控制器,它可以工作:

@RequestMapping(value = "/delele", method = RequestMethod.DELETE)
public void deleteOldData(@RequestParam(value = "date") String date) {
        sampleRepository.deleteOutdatedData(Instant.parse(date));
}

我想实现一个调度程序来删除过时的数据。例如:

@Scheduled(fixedDelayString = "${clean-processing-delay}")
public void cleanOutdatedData() {
    Instant instant = Instant.now().minusMillis(expirationInterval);
    sampleRepository.deleteOutdatedData(instant);
}

调度程序在正确的时间工作,但我遇到了一个异常:

嵌套异常是org.springframework.dao.InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套异常是javax.persistence.TransactionRequiredException:执行更新/删除查询

我哪里弄错了?

java spring transactions spring-data-jpa scheduler
1个回答
0
投票

您需要在事务中包含您的方法,如下所示:

@Scheduled(fixedDelayString = "${clean-processing-delay}")
  @Transactional
  public void cleanOutdatedData() {
    Instant instant = Instant.now().minusMillis(expirationInterval);
    sampleRepository.deleteOutdatedData(instant);
  }
© www.soinside.com 2019 - 2024. All rights reserved.