java - Spring TransactionManager - 提交不起作用

标签 java jdbc transactions spring-batch transactionmanager

我正在尝试创建基于 Spring 的解决方案,以便在 MySQL 5.5 服务器上运行批处理 SQL 查询。 “查询”是指任何编译的 SQL 语句,因此 SQL 批处理作业可以包含例如多个 CREATE TABLE、DELETE 和 INSERT 语句。

我正在使用 Spring Batch以此目的。

我有 transactionManager 配置如下。

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

数据源:

    <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>

我的 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 方法在每次调用时都提交(在它执行的每个 SQL 语句之后提交)。

最佳答案

您不能代理私有(private)方法。即你在这里的 @Transactional 没有效果。将该方法拉到您的父接口(interface),它应该可以工作。除非您启用了不推荐的 proxyTargetClass 设置。

关于java - Spring TransactionManager - 提交不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10085771/

相关文章:

java - 如何使用 JDBC 连接到具有集成安全性的 Sql Server(通过 persistence.xml)

java - 如何在 Oracle 数据库中仅插入 CSV 文件中的唯一值?

java - JPA SQL Server 没有 JDBC 类型 : -9 的方言映射

ios - NSUserDefaults 事务性

java - 如何使用 ximpleware 获取 XML 中的内部数组子元素

java - 将字符添加到 BufferedInputStream java 的末尾

java - 从Java中的Runnable线程调用主线程

java - 了解何时以及如何使用 Java 8 Lambdas

ruby-on-rails - 提交所有操作后,rails Transactions block 是否退出?

java - 与数据源手动交互后回滚测试中的更改?