关于spring中事务不回滚的解决方式

关于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如何针对双数据库而配置事务管理的话,可以暂时把数据库改为一个.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值