使用@Transactional声明式事务不回滚的原因
有可能导致事务不回滚问题
1、把注解加到非public修饰的方法上
2、不是 RuntimeException 的异常
如果不是RuntimeException 默认的注解是不会回滚的,需要增加配置rollbackFor={Exception.class}
@Transactional(propagation = Propagation.REQUIRED ,rollbackFor={Exception.class})
3、使用try catch 捕获了异常,但是有没有把异常向上抛
如果是已经捕获了异常就不会在回滚事务了,如果要回滚可以手动抛出异常
try {
//代码
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
4、因为项目中同时使用hibernate和mybatis框架,然后mybatis没有配置事务管理
<!-- 配置数据源 -->
<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" >
<property name="driverClass" value="${database.driverClassName}"/>
<property name="jdbcUrl" value="${database.url}"/>
<property name="user" value="${database.username}"/>
<property name="password" value="${database.password}"/>
<property name="automaticTestTable" value="${c3p0.automaticTestTable}"/>
</bean>
<!--使用spring的事务处理-->
<!--声明事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="txManager">
<!--连接的数据库,指定数据源-->
<property name="dataSource" ref="myDataSource"></property>
</bean>
<!-- 事务注解驱动,标注@Transactional的类和方法将具有事务性 -->
<tx:annotation-driven transaction-manager="txManager" />
又由于项目原来有hibernate的事务,后面有加了mybatis的事务,所以在使用事务的时候需要指定使用的事务
@Transactional(value = "txManager",propagation = Propagation.REQUIRED ,rollbackFor={Exception.class})