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 包下的所有注解。
此处我们将扫描注解配置分开来扫。
spring-mvc.xml
中,修改为只扫描com.mvc.Controller
包下的注解。spring-mybatis.xml
中,只扫描service 和 dao
包下的注解。
配置完成后,再次启动工程,测试发现:事务OK了。 如图↓↓↓
完美。具体原因不清楚为什么。。。正常了,就这吧,也不深研究为什么了。代码就是太深奥
我的整个工程只配置了一个 <context:component-scan>
,有的小伙伴可能配置了多个扫描,出现一个包被多次扫描的问题,导致冲突。也有可能出现事务失败的问题。
博主写作不易,来个关注呗
求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙
博主不能保证写的所有知识点都正确,但是能保证纯手敲,错误也请指出,望轻喷 Thanks♪(・ω・)ノ