Транзакционность на уровне задания в Spring Batch

Я знаю, что сейчас в Spring-Batch нет такой вещи, как межэтапная транзакция. Я разрабатываю сложное пакетное задание, в котором многие шаги выполняют несколько действий в базе данных, и каждый из них связан с другими таким образом, что каждый из них принадлежит одной и той же транзакции. Как я понимаю парадигму Spring-Batch, я обязан использовать одноэтапное задание, чтобы обеспечить транзакционность. Есть ли какая-нибудь мысль (или какой-либо другой способ) иметь некоторую транзакционность на уровне заданий в последних или будущих версиях?

Edit1: я нашел в этой ссылке, пункт 6.3.1. , способ объединить несколько процессоров, но он не удовлетворяет мои текущие потребности.

Edit2: эта другая ссылка предлагает мне возможность использования класс конверта с аннотацией «@Transactional», который вызовет мою работу и, следовательно, будет иметь внешнюю транзакцию.


person mantoviejo    schedule 19.09.2012    source источник
comment
Вы пытались использовать только один шаг и поместить логику из многих шагов в несколько действий в бизнес-реализацию?   -  person Michael Pralow    schedule 19.09.2012
comment
Да, я пробовал (и был вынужден продолжать) использовать одноступенчатые пакеты. Но я считаю, что Spring настолько адаптируется, что было бы весьма полезно иметь транзакцию на уровне задания, позволяющую использовать ее по-разному.   -  person mantoviejo    schedule 19.09.2012
comment
Самая большая ошибка в одноэтапном задании заключается в том, что вам нужно добавить всю свою бизнес-логику в один (или несколько) процессоров. Таким образом, я думаю, вы не следуете концепции Spring-Batch, добавляя всю сложность процесса за один шаг и ограничиваясь использованием DAO в процессоре для достижения ваших логических целей.   -  person mantoviejo    schedule 20.09.2012
comment
Проблема с транзакционным заданием: пакет фиксирует 1.000.000 элементов сразу   -  person Michael Pralow    schedule 20.09.2012
comment
Я предполагаю, что это зависит от объема данных, которыми вы управляете. Также я рассматриваю этот потенциальный вариант как улучшение гибкости в текущей Spring Batch.   -  person mantoviejo    schedule 21.09.2012


Ответы (1)


Наконец-то я нашел способ сделать это. Как сказано в предыдущем выпуске, вы должны вызвать задание из транзакционного метода:

@Transactional (распространение = Propagation.REQUIRED)

Важно установить требуемый уровень распространения на этом уровне. И установите распространение уровня задания на «обязательное», добиваясь этим, чтобы задание и шаги добавляли свои транзакции к текущему. Тем не менее, как писал Майкл Ланге, важно учитывать потенциальный размер тома, которым вы управляете, чтобы избежать превышения лимита коммитов или откатов.

person mantoviejo    schedule 21.09.2012