Коммит Spring TransactionManager -не работает

Я пытаюсь создать решение на основе Spring-для запуска пакета запросов SQL на сервере MySQL 5.5. Под «запросом» я подразумеваю любой оператор SQL, который компилируется, поэтому пакетное задание SQL может содержать, например, несколько операторов CREATE TABLE, DELETE, а затем INSERT.

Для этой цели я использую Spring Batch .

У меня transactionManagerнастроен следующим образом.

    
        
    
    

иdataSource:

    
    
    
      
     
    
    
    
    
    
    
    
    
    
    

Мой класс DAO имеет метод, настроенный с помощью

@Transactional(propagation = Propagation.REQUIRES_NEW)

, и я перебираю набор операторов SQL, вызывая метод с одним оператором SQL за раз. Обработка внутри метода так же проста, как:

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 и увидел, что фиксация, которую я вызываю из моего метода DAO, выполняется TransactionTemplate (поток достигает строки this.transactionManager.commit(status);и проходит без исключения)

Я был бы признателен за любой совет, что нужно сделать, чтобы заставить метод DAO выполнять фиксацию при каждом вызове (commit после каждого выполняемого оператора SQL).

7
задан aviad 10 April 2012 в 08:58
поделиться