是否可以使用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时,一切运行良好。但是现在,感觉春天的交易管理无处不在。