关于spring中事务不回滚的问题,网上查了很多资料,基本有如下可能性:
假如我们把事务加到Service层:
1.Service层的方法我们try...catch了,导致AOP捕获不到异常. 所以事务控制失败.
解决方式: 不要在Service层try...catch即可.
或在catch块最后加上"throw new RuntimeException()".这样一场才能被AOP捕获.(个人未尝试)
2.数据库问题,mysql为绿色版,或不支持回滚.可以尝试安装正式版.
但是本人在排除以上问题后,发现事务依然无法回滚.
经过分析,发现自己的项目中,在spring的dao配置文件中,由于业务需要,配置了双数据库切换模式.
配置片段如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据库连接池 -->
<property name="dataSource" ref="multipleDataSource" />
<!--配置mybatis全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!--扫描entity包,使用别名,多个用;隔开 -->
<property name="typeAliasesPackage" value="com.skr.mdm.entity" />
<!--扫描sql配置文件:mapper需要的xml文件 -->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>
<bean id="multipleDataSource" class="com.skr.mdm.controller.dataSource.MultipleDataSource">
<property name="defaultTargetDataSource" ref="dataSource"/>
<property name="targetDataSources">
<map>
<entry key="hyaq" value-ref="dataSource"/>
<entry key="yecall" value-ref="dataSource1"/>
</map>
</property>
</bean>
可以看到,sqlSessionFactory这个bean里,dataSource字段引用的是multipleDataSource这个bean,而不是传统上常用的普通dataSource.
所以,我把第二个bean:multipleDataSource注释掉,把sqlSessionFactory的dataSource字段所引用的bean改成:dataSource之后,事务顺利回滚!
注:multipleDataSource这个bean是专用于切换双数据库的.
总结:
spring无论是声明式事务回滚,还是注解式,它的事务管理,主要是针对于单个数据库配置而发生作用的.
如果没有时间深入了解spring如何针对双数据库而配置事务管理的话,可以暂时把数据库改为一个.