We are changing our spring batch application to multiple data source so that metadata tables can go to H2 database(Avoid operational purging effort and improve performance) and business tables will be in oracle DB. After changing this, CompositeWriter transaction is partially committing as we have 3 tables in CompositeWriter. Ist table committed and 2nd table error thrown but rollback not happening for Ist table. This is working fine in default single data source . This question is related to transaction management of multiple datasources in spring batch having composite writer.
    ######### SPRING BATCH H2 DATASOUCRE Batch MetData ######
    springbatch.datasource.driver-class-name=org.h2.Driver
    springbatch.datasource.url=jdbc:h2:file:C:/IDE/jan
    springbatch.datasource.username=ngecom
    springbatch.datasource.password=ngecom
    springbatch.datasource.configuration.connection-timeout=600000
    springbatch.datasource.configuration.minimum-idle=5 
    springbatch.datasource.configuration.maximum-pool-size=50
    springbatch.datasource.configuration.idle-timeout=600000 
    springbatch.datasource.configuration.max-lifetime=1800000 
    springbatch.datasource.configuration.auto-commit=true 
    springbatch.datasource.configuration.poolName=SpringBoot-HikariCPPrimary
    springbatch.datasource.configuration.leak-detection-threshold=0
    
    ########JDBC Oracle Datasource########
    #connection timeout 10 min
    app.datasource.username=ngbilling
    app.datasource.url=ourDBServer
    app.datasource.driver-class-name=oracle.jdbc.OracleDriver
    app.datasource.configuration.connection-timeout=600000
    app.datasource.configuration.minimum-idle=5 
    app.datasource.configuration.maximum-pool-size=50
    app.datasource.configuration.idle-timeout=600000 
    app.datasource.configuration.max-lifetime=1800000 
    app.datasource.configuration.auto-commit=true 
    app.datasource.configuration.poolName=SpringBoot-HikariCPSecodary
    app.datasource.configuration.leak-detection-threshold=0
    
    
    @Configuration
    public class DataSourceRepository {
    
        @Bean   
        @Primary
        @ConfigurationProperties(prefix = "springbatch.datasource")
        public DataSourceProperties springBatchDataSourceProperties() {
            return new DataSourceProperties();
        }
    
        @Bean(name = {"dataSourceSpringBatch"})
        @Primary
        @ConfigurationProperties("springbatch.datasource.configuration")
        public HikariDataSource springBatchDataSource() {
            return springBatchDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
        }
        
        
        @Bean   
        @ConfigurationProperties(prefix = "app.datasource")
        public DataSourceProperties appDataSourceProperties() {
            return new DataSourceProperties();
        }
    
        @Bean(name = {"bscsDataSource"})
        @ConfigurationProperties("app.datasource.configuration")
        public HikariDataSource appDataSource() {
            return appDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
        }
        
        @Bean(name = "bscsJDBCTemplate")
        public JdbcTemplate jdbcTemplate(@Qualifier("bscsDataSource") DataSource bscsDataSource) {
         return new JdbcTemplate(bscsDataSource);
    }
    
      @Bean
        public CompositeItemWriter compositeWriter() throws Exception {
            CompositeItemWriter compositeItemWriter = new CompositeItemWriter();
            List<ItemWriter> writers = new ArrayList<ItemWriter>();
            writers.add(summaryWriter());
            writers.add(detailsWriter());
            writers.add(chartWriter());
            compositeItemWriter.setDelegates(writers);
            return compositeItemWriter;
        }   
    
    @Bean
        public JdbcBatchItemWriter<UnifiedInvoiceDTO> summaryWriter() {
            JdbcBatchItemWriter<UnifiedInvoiceDTO> databaseItemWriter = new JdbcBatchItemWriter<>();
            databaseItemWriter.setDataSource(dataSource);
            databaseItemWriter.setSql(BSCSUtils.QUERY_INSERT_UBI_SUMMARY);
            ItemPreparedStatementSetter<UnifiedInvoiceDTO> invoicePreparedStatementSetter = new InvoiceSummarySetter();
            databaseItemWriter.setItemPreparedStatementSetter(invoicePreparedStatementSetter);
            return databaseItemWriter;
        }
     @Bean
        public Step slaveStep() throws Exception {
            return stepBuilderFactory.get("slaveStep").<UnifiedInvoiceDTO, UnifiedInvoiceDTO>chunk(chunkSize)
                    .reader(xmlItemReader(null)).processor(xmlFileItemProcessor()).writer(compositeWriter()).faultTolerant()
                    .skipLimit(skipErrorCount).skip(Exception.class).noSkip(FileNotFoundException.class)
                    .listener(itemSkipListener()).build();
        }
@Component
public class BatchJobScheduler extends BasicBatchConfigurer {
    protected BatchJobScheduler(BatchProperties properties, DataSource dataSource,
            TransactionManagerCustomizers transactionManagerCustomizers) {
        super(properties, dataSource, transactionManagerCustomizers);
        // TODO Auto-generated constructor stub
    }}
