Можно ли использовать jpaRepository для выполнения операций CRUD внутри запланированной Задачи (с пометкой @Scheduled
) без переноса запланированного метода с @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, все работает отлично. но теперь кажется, что управление пружинными транзакциями мешает на каждом шагу.