Я пытаюсь создать решение на основе 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).