当前位置: 首页 > 知识库问答 >
问题:

Scheduler、Crudepository和TransactionRequiredException

太叔飞翰
2023-03-14

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

public interface SampleRepository extends PagingAndSortingRepository<Sample, String> {

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

如果我使用rest控制器,它会工作:

@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。刀。InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredException:执行更新/删除查询

我哪里弄错了?

共有1个答案

田普松
2023-03-14

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

@Scheduled(fixedDelayString = "${clean-processing-delay}")
  @Transactional
  public void cleanOutdatedData() {
    Instant instant = Instant.now().minusMillis(expirationInterval);
    sampleRepository.deleteOutdatedData(instant);
  }
 类似资料:
  • 如果你想给Observable操作符链添加多线程功能,你可以指定操作符(或者特定的Observable)在特定的调度器(Scheduler)上执行。 某些ReactiveX的Observable操作符有一些变体,它们可以接受一个Scheduler参数。这个参数指定操作符将它们的部分或全部任务放在一个特定的调度器上执行。 使用ObserveOn和SubscribeOn操作符,你可以让Observab

  • scheduler 实现调度、负载均衡的算法。

  • 6.2 使用和定制Scheduler Scheduler是WebMagic中进行URL管理的组件。一般来说,Scheduler包括两个作用: 对待抓取的URL队列进行管理。 对已抓取的URL进行去重。 WebMagic内置了几个常用的Scheduler。如果你只是在本地执行规模比较小的爬虫,那么基本无需定制Scheduler,但是了解一下已经提供的几个Scheduler还是有意义的。 类 说明 备

  • 我在我的项目中使用Spring 5。直到今天,还有可用的方法。 但下载最新快照后,它突然消失了!有没有参考现在没有的方法? 我的依赖项列表: 更新: 似乎此方法已被

  • ?> 所有的协程必须在协程容器里面创建,Swoole程序启动的时候大部分情况会自动创建协程容器,用Swoole启动程序的方式一共有三种: 调用异步风格服务端程序的start方法,此种启动方式会在事件回调中创建协程容器,参考enable_coroutine。 调用Swoole提供的2个进程管理模块Process和Process\Pool的start方法,此种启动方式会在进程启动的时候创建协程容器,参

  • Task Scheduler You can use the task scheduler to automatically start and stop certain tasks at defined times and intervals. You can use the task scheduler to start and stop certain automated tasks out