7.Closing non transactional SqlSession 导致事务失败问题

        博主在研究Spring事务源码,编写测试代码时,出现了Closing non transactional SqlSession 导致事务失败的问题,于是写下这篇文章,记录一下这个问题。

前提

        已经通过配置方式,开启了 Spring 声明式事务。配置没问题,按正常情况,如下代码将会在执行两次 insert() 插入操作后,因 RuntimeException 异常而导致回滚。

@Override
@Transactional
public void add(Integer num){
    userDao.insertB();
    userDao.insertA();
    if (num < 5) {
        throw new RuntimeException("测试异常");
    }
}

        结果却是: 事务都是正提交。然后博主在 编程式事务声明式事务 之前切换,怀疑自己配置错了,却始终都是一样的结果。完全无厘头了,因为自己配置没有任何问题,都开始怀疑 Spring 版本的问题了。
在这里插入图片描述
在这里插入图片描述
        在测试项目中,有配置多个 xml 文件,通过 <import> 的方式引入。如下图所示:各个配置文件分别对应 MVC,MyBatis,Transaction 的配置。
在这里插入图片描述
问题所在:

        在 spring-mvc.xml 中,配置 <context:component-scan base-package=“com.mvc”/> 开启配置扫描。就是在这里出了问题!!! 它会扫描 com.mvc 包下的所有注解。
在这里插入图片描述
此处我们将扫描注解配置分开来扫。

  1. spring-mvc.xml 中,修改为只扫描com.mvc.Controller 包下的注解。
  2. spring-mybatis.xml中,只扫描 service 和 dao包下的注解。

配置完成后,再次启动工程,测试发现:事务OK了。 如图↓↓↓

完美。具体原因不清楚为什么。。。正常了,就这吧,也不深研究为什么了。代码就是太深奥
在这里插入图片描述

        我的整个工程只配置了一个 <context:component-scan>,有的小伙伴可能配置了多个扫描,出现一个包被多次扫描的问题,导致冲突。也有可能出现事务失败的问题。


博主写作不易,来个关注呗

求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙

博主不能保证写的所有知识点都正确,但是能保证纯手敲,错误也请指出,望轻喷 Thanks♪(・ω・)ノ