在计划任务中使用spring jpaRepository而不包装事务

时间:2018-10-29 13:21:51

标签: spring spring-data-jpa spring-scheduled

是否可以使用jpaRepository在计划的任务(用@Scheduled注释)中执行CRUD操作,而无需用@Transactional包装计划的方法?

用例:

我们有一个调度程序来弹出作业,每个作业都有一定的操作要执行,并相应地提取和保存数据。

private void processJob(T job) throws Exception {
    updateJobToTaken(job);
    internalProcess(job); //calls a service to run the job operations
    updateJobToDone(job);
}

1-如果我们不使用@Transactional包装方法,则在internalProcess()内完成的所有操作都不会保存到数据库。所以我们添加了@Transactional(propagation.REQUIRES_NEW)

2-这在我们的dryRun标志上造成了回归:我们添加了一个dryRun标志,该标志传递给internalProcess方法。如果标志是true,我们将跳过调用repository.save(entities),并期望没有保存任何工作。因此,我们只需将更改记录到控制台即可。

if (!dryRun) {
  setupsGroupRepository.save(setupsGroup);
}

但是由于该方法是事务性的,因此Spring提交了更改,并且一切都已提交。

我们想要什么?

显式控制数据库访问。意思是如果我不打电话给repository.save(),那我就什么都不会做。反之亦然,当我致电repository.save()时,我希望我的更新完全提交给数据库。

当我们直接调用internalProcess方法而没有scheduleTask时,一切运行良好。但是现在,感觉春天的交易管理无处不在。

0 个答案:

没有答案