Я использую REQUIRES_NEW, потому что мне нужно сразу увидеть результаты в БД, иначе мы не сможем увидеть подробный результат, пока не закончится весь пакет.
Я не вижу действительных причина для этого. Зачем тогда использовать шаг, ориентированный на чанк? Шаг, ориентированный на порцию, используется, когда порция записей предназначена для обработки и записи как единица (на границах транзакции порции), то есть семантика "все или ничего".
Итак, попытка чтобы обойти это, если вложенные меньшие транзакции внутри той, что управляется Spring Batch, в первую очередь работают против цели обработки, ориентированной на куски.
Я рекомендую изменить ваш подход, удалив @Transactional(propagation = Propagation.REQUIRES_NEW)
и выбрав меньшую размер чанка, если вы хотите, чтобы больше записей фиксировалось в базу данных чаще.
Как я могу видеть, что коммиты выдают в журналах?
В дополнение к настройке уровень журнала для отладки для Spring Batch и Spring JDB C, я использую p6spy , чтобы увидеть все операторы, отправленные в базу данных. Это даст вам что-то вроде:
1543399291411|0|statement|connection0|select BATCH_STEP_EXECUTION_SEQ.nextval from dual
1543399291412|0|statement|connection0|INSERT into BATCH_STEP_EXECUTION(STEP_EXECUTION_ID, VERSION, STEP_NAME, JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, COMMIT_COUNT, READ_COUNT, FILTER_COUNT, WRITE_COUNT, EXIT_CODE, EXIT_MESSAGE, READ_SKIP_COUNT, WRITE_SKIP_COUNT, PROCESS_SKIP_COUNT, ROLLBACK_COUNT, LAST_UPDATED) values(1, 0, 'step', 1, '28-Nov-18', NULL, 'STARTING', 0, 0, 0, 0, 'EXECUTING', '', 0, 0, 0, 0, '28-Nov-18')
1543399291413|0|statement|connection0|INSERT INTO BATCH_STEP_EXECUTION_CONTEXT (SHORT_CONTEXT, SERIALIZED_CONTEXT, STEP_EXECUTION_ID) VALUES('{}', NULL, 1)
1543399291413|0|commit|connection0|