java - 调度程序、CrudRepository 和 TransactionRequiredException

标签 java spring transactions spring-data-jpa scheduler

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

public interface SampleRepository extends PagingAndSortingRepository<Sample, String> {

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

如果我使用休息 Controller ,它就可以工作:

@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);
}

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

nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

我哪里错了?

最佳答案

您需要将您的方法封装在事务中,如下所示:

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

关于java - 调度程序、CrudRepository 和 TransactionRequiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45057589/

相关文章:

java.lang.NoClassDefFoundError : com. sun.org.apache.commons.beanutils.PropertyUtils

java - @RepositoryRestResource 在 Spring Boot 2.2.1.RELEASE 中不起作用。运行时出现错误 RegionRepository 必须只包含一个路径段

邮件 API : Checking the size limit of the server

java - WEB-INF 目录中的 JSF 文件,如何访问它们?

java - SpringBoot重试,剩余重试次数

java - Spring 服务的可选嵌套注入(inject)

.net - 为什么 WCF 需要 DTC 来处理事务流?

java - 事务完成后,我们将对象返回为 null

postgresql - 读取由 postgresql 函数创建的未提交行?

java - 带反射的模块化共闭包原理