Spring TransactionManager - commit not working

I am trying to create a Spring based solution to run batch SQL queries on a MySQL 5.5 server. By “query” I mean any SQL statement that compiles, so a SQL batch job can contain, for example, several CREATE TABLE, DELETE, and INSERT statements.

I am using Spring Batch for this purpose.

I have transactionManagerconfigured as follows.

    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />

and dataSource:

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${batch.jdbc.driver}" />
    <property name="url" value="${batch.jdbc.url}" />
    <property name="username" value="${batch.jdbc.user}" />  
    <property name="password" value="${batch.jdbc.password}" /> 
    <property name="maxIdle" value="10" />
    <property name="maxActive" value="100" />
    <property name="maxWait" value="10000" />
    <property name="validationQuery" value="select 1" />
    <property name="testOnBorrow" value="false" />
    <property name="testWhileIdle" value="true" />
    <property name="timeBetweenEvictionRunsMillis" value="1200000" />
    <property name="minEvictableIdleTimeMillis" value="1800000" />
    <property name="numTestsPerEvictionRun" value="5" />
    <property name="defaultAutoCommit" value="true" />
</bean>

My DAO class has a method configured with

@Transactional(propagation = Propagation.REQUIRES_NEW)

and I iterate over the set of SQL statements calling the method with one SQL statement at a time. Processing inside the method is the same as:

simpleJdbcTemplate.getJdbcOperations().execute(sql);

, DAO , . , , Spring , .

DAO:

@Transactional(propagation = Propagation.REQUIRES_NEW)
private void executeSingleQuery(String sql) {
    PlatformTransactionManager transactionManager = (PlatformTransactionManager)context.getBean("transactionManager");


    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(Propagation.REQUIRED.ordinal());

    TransactionStatus status = transactionManager.getTransaction(def);

    try {
        // execute your business logic here
        log.info("about to execute SQL query[" + sql + "]");
        simpleJdbcTemplate.getJdbcOperations().execute(sql);

    } catch (Exception e) {
        log.info("SQL query  was not committed due to exception and was marked for rollback");
        transactionManager.rollback(status);
    }

    transactionManager.commit(status);

    if (transactionManager.getTransaction(null).isRollbackOnly() 
            && transactionManager.getTransaction(null).isCompleted()) {
        log.info("SQL query commited!");
    } else {
        log.info("SQL query  was not committed due to: 1) the transaction has been marked for rollback " +
                "2) the transaction has not completed for some reason");
    }

    log.info("the query has completed");
}

Spring , commit, DAO, TransactionTemplate ( this.transactionManager.commit(status); )

, , DAO ( SQL-).

+5
3

. .. @Transactional, , . , . proxyTargetClass, .

+8

executeSingleQuery() , -, .

. , REQUIRES_NEW, @Transactional Propagation.REQUIRES_NEW DefaultTransactionDefinition.

, transactionManager.commit(status) try, , Exception.

+3

@Rollback(value = false) , .

0

All Articles