spring + mybatis 注解 @Transactional失效

1.问题

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

***  was not registered for synchronization because synchronization is not active
或者
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3ca5cba7]JDBC Connection [com.mysql.jdbc.JDBC4Connection@79436e0a] 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了...

原文地址:https://www.cnblogs.com/lishuaiqi/p/10485202.html

时间: 2024-10-12 12:58:24

spring + mybatis 注解 @Transactional失效的相关文章

Spring事务注解@Transactional失效的问题

在项目中发现事务失效,使用@Transactional注解标注的Service业务层实现类方法全部不能回滚事务了,最终发现使用因为Spring与shiro进行整合之后导致的问题,将所有的Service层实现类都添加如下注解 @Scope(proxyMode= ScopedProxyMode.TARGET_CLASS) 将代理方式换成CGLib的代理方式之后得以解决,最终不明原因,如有看到这篇博客并知道答案的朋友请留言告知 如果事务不能回滚,也需要考虑如下几点: 表得存储引擎为MyISAM是没有事

spring + myBatis 注解失败

今天配置spring+myBatis的时候,使用注解@Autowired把持久层dao注入service层的时候总是报错. 查了好久才发现,居然是配置文件路径写错了.basepackge的路径一定要正确 <!-- DAO接口所在包名,spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSess

关于Spring+mybatis使用@Transactional注解事物没有生效的问题

控制台日志信息: was not registered for synchronization because synchronization is not active JDBC Connection. Closing non transactional SqlSession [[email protected]19e35973] 出现以上信息说明spring的事物被覆盖掉了,通常是因为在spring.xml中扫描了一次@service注解后,springmvc.xml又重新扫描@servic

spring mvc 注解 annot失效

如果带上事务,那么用annotation方式的事务注解和bean配置,事务会失效,要将service bean配置到xml文件中才行 这个问题是由于问答上有解决方案 引用 这个问题很经典了 在主容器中(applicationContext.xml),将Controller的注解排除掉 <context:component-scan base-package="com">   <context:exclude-filter type="annotation&q

Spring 事务注解@Transactional

事务管理一般有编程式和声明式两种,编程式是直接在代码中进行编写事物处理过程,而声名式则是通过注解方式或者是在xml文件中进行配置,相对编程式很方便. 而注解方式通过@Transactional 是常见的.我们可以使用@EnableTransactionManagement 注解来启用事务管理功能,该注解可以加在启动类上或者单独加个配置类来处理. 1.Transactional 注解的属性 name 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器

23. Spring 事务注解@Transactional和异常捕获

一. 事务注解限制条件 1. 不允许在private方法上面 2. 不能在非事务方法里面调用事务方法 二. 实现机制-异常捕获 Describes transaction attributes on a method or class. This annotation type is generally directly comparable to Spring's org.springframework.transaction.interceptor.RuleBasedTransactionA

spring,mybatis事务管理配置与@Transactional注解使用

spring,mybatis事务管理配置与@Transactional注解使用[转] 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects) 支持声明式事务管理,特别是基

spring,mybatis事务管理配置与@Transactional注解使用[转]

spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence A

项目记录:spring+springmvc 项目中 @Transactional 失效的解决方法

第一步,修改spring的配置文件和springmvc的配置文件 --------------------------------applicationContext.xml <context:annotation-config/>  <context:component-scan base-package="com.xxx"> <context:exclude-filter type="annotation" expression=&