Spring 事务管理器 : Rollback doesnt work

标签 spring transactions spring-transactions transactionmanager

我希望在一个事务 block 中执行一些插入查询,如果有任何错误,所有插入都将被回滚。

为此,我正在使用 MySQL 数据库和 Spring TransactionManager。 表类型也是 InnoDB

我已按照提到的步骤完成配置 here .

以下是我的代码(现在只有一个查询)

TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = null;

status = transactionManager.getTransaction(def);
jdbcTemplate.execute(sqlInsertQuery);
transactionManager.rollback(status);

Spring 配置 xml:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

数据源配置:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="initialSize" value="${jdbc.initialSize}" />
    <property name="maxActive" value="${jdbc.maxActive}" />
    <property name="minIdle" value="${jdbc.minIdle}" />
    <property name="maxIdle" value="${jdbc.maxIdle}" />
    <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
    <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
    <property name="testOnReturn" value="${jdbc.testOnReturn}" />
    <property name="validationQuery" value="${jdbc.validationQuery}" />
    <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
    <!--<property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" 
        value="10"/> <property name="logAbandoned" value="false"/> -->
    <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}" />
</bean>

这段代码工作得很好并且记录被插入。 但是回滚不起作用!它执行回滚语句没有任何错误,但没有效果。

谁能指导我哪里出错了?

最佳答案

看来问题是您的数据源未设置为关闭自动提交。

<property name="defaultAutoCommit" value="false"/>

试一试。我从来没有在代理之外使用过 TransactionManager,所以我不确定是否还有其他陷阱像这样直接使用它,但我建议您查看 AOP 事务或方便的 AOP 代理注释 @Transactional,因为它更常见.

关于 Spring 事务管理器 : Rollback doesnt work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216137/

相关文章:

spring - Spring 3 MVC 中的 HttpSession

java - Spring boot应用程序启动时如何缓存数据

sql - Postgres,更新和锁定顺序

java - 在 ControllerTest 中使用 @WebAppConfiguration 而不是 @SpringBootTest 时,Spring Data JPA 中会忽略延迟初始化

activemq - JAVA - Spring Integration Flow 事务 + com.atomikos.icatch.HeurHazardException : Heuristic Exception

java - Spring Data Elasticsearch 与 ES 7.2.1 |索引时 GeoPoint 映射失败

java - 如何分解 <fo :table-block> present inside <fo:table-cell> 的内容

grails - 从GORM获取对象集

MySQL:START TRANSACTION - UPDATE - ROLLBACK:非事务表

java - 为什么 Spring 的事务管理不适用于此配置?