spring + mybatis 注解 @Transactional失效

Posted 随意的马蒂洛克

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring + mybatis 注解 @Transactional失效相关的知识,希望对你有一定的参考价值。

1.问题

在使用@Transactional注解管理事务的时候会出现很多错误,比如:

***  was not registered for synchronization because synchronization is not active
或者
Closing non transactional SqlSession [[email protected]]
JDBC Connection [[email protected]] will not be managed by Spring

总之就是事务没有被spring管理,注解@Transactional失效.

2.原因:

重复扫描包的问题. 因为springmvc的配置文件已经扫描了service和controller注解,而spring的配置文件又扫描了一遍,所以会出错. 

spring 通过 cglib 生成了带有事务功能的代理类.

但是spring mvc 在扫描一遍又重新生成了 service 层的不带事务功能的代理类,把之前的代理类给覆盖掉了,

所以会导致事务失效.

因此解决就是把springmvc扫描service给过滤掉就可以了,

3.解决:

让springmvc的配置文件只扫描controller

    <context:component-scan base-package="com.fyq" >
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Service" />
    </context:component-scan>
    

通过 filter 把service注解给过滤掉.

同理 spring 的配置文件只扫描service层,把controller给过滤掉.

    <context:component-scan base-package="com.fyq" >
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

 

 

该用spring-boot了...

以上是关于spring + mybatis 注解 @Transactional失效的主要内容,如果未能解决你的问题,请参考以下文章

mapperscannerconfigurer 怎么注解

Spring boot 学习六 spring 继承 mybatis (基于注解)

玩转SSH:Struts + Spring + MyBatis(注解版)

聊聊Mybatis集成Spring 注解方式

详解spring boot mybatis全注解化

Spring.Day16.MyBatis注解