использовать Spring jpaRepository в запланированном задании без переноса в транзакции - PullRequest
0 голосов
/ 29 октября 2018

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

...