#spring-boot #transactions #spring-batch
#весенняя загрузка #транзакции #spring-batch
Вопрос:
Я использую SpringBatch для своего приложения. В одном из пакетных заданий мне нужно обработать несколько данных. Для каждого данные требуется несколько обновлений базы данных. И мне нужно сделать одну транзакцию для одних данных. Это означает, что если при обработке одних данных возникает исключение, обновления базы данных откатываются для этих данных, а затем продолжают обработку следующих данных.
Я поместил все обновления базы данных в один метод на уровне обслуживания. В моем тасклете springbatch я вызываю этот метод для каждого данные, например;
for (RequestViewForBatch request : requestList) {
orderService.processEachRequest(request);
}
В классе service метод выглядит следующим образом;
Transactional(propagation = Propagation.NESTED, timeout = 100, rollbackFor = Exception.class)
public void processEachRequest(RequestViewForBatch request) {
//update database
}
При выполнении задачи выдается следующее сообщение об ошибке
org.springframework.transaction.NestedTransactionNotSupportedException: Transaction manager does not allow nested transactions by default - specify 'nestedTransactionAllowed' property with value 'true'
но я не знаю, как решить эту ошибку.
Любое предложение будет оценено. Заранее спасибо.
Ответ №1:
Шаг тасклета будет выполнен в транзакции, управляемой Spring Batch. Вам необходимо удалить @Transactional
свой processEachRequest
метод.
Вам потребуется отказоустойчивый шаг, ориентированный на фрагменты, настроенный с политикой пропуска. В этом случае будут пропущены только ошибочные элементы. Пожалуйста, обратитесь к разделу документации «Настройка логики пропуска«. Вы можете найти пример здесь.
Комментарии:
1. Большое вам спасибо. Я попробую кодирование, ориентированное на фрагменты!
2. Я начинаю пытаться записать ее в ориентированной на фрагменты модели, используя ItemReader / ItemProcessor / ItemWriter, но в каждом цикле мне нужно обрабатывать много данных во многих разных таблицах. Подробно … 1. Получите все записи, которые необходимо обработать, из таблицы A / 2. для каждой записи обновите несколько таблиц (TableA, таблица B, таблица C и так далее), и этот процесс должен быть в одной транзакции. Так что я понятия не имею, можно ли это сделать с помощью ItemReader / Processor / Writer.