转自:https://blog.csdn.net/awp0011/article/details/50735616 遇到同样的问题
近日工作中遇到了这样一个问题:
一个Java Web项目(Spring+mybatis), 在Spring配置了数据库事务(声明式),没有使用注解式的原因是:项目前期的开发者认为给每个Service类加上@Transcational注解是繁琐的事情(难道这些类也加上了@Service的注解就不繁琐了?)
在中期测试时发现,数据库事务设置不起作用,遇到异常数据没有回滚~~!(前期测试时为什么没有发现呢? PO开始时说不需要管数据库事务的问题,可能是觉得配置了就不会出问题),现在要发布一个版本,不得不处理该问题了。
-
首先,检查sprint的配置
目测没有什么问题,编写测试代码:在一个方法中插入多条数据后抛出一个异常,运行测试代码,结果数据表中的数据确实没有回滚,异常之前的数据都以提交到数据表中。 -
然后,再次检查spring数据库配置xml
修改AOP设置中的pointcut节点,怀疑是expression配置的不正确。修正后事务依然不起作用。 -
第三,开始在网上搜索
我注意有和我面临的情况相似的问题:
由于采用的是SpringMVC、 MyBatis,故统一采用了标注来声明Service、Controller
由于服务器启动时的加载配置文件的顺序为web.xml—root-context.xml(Spring的配置文件)—servlet-context.xml(SpringMVC的配置文件),由于root-context.xml配置文件中Controller会先进行扫描装配,但是此时service还没有进行事务增强处理,得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力),所以我们必须在root-context.xml中不扫描Controller
Spring容器优先加载由ServletContextListener(对应applicationContext.xml)产生的父容器,而 SpringMVC(对应mvc_dispatcher_servlet.xml)产生的是子容器。子容器Controller进行扫描装配时装配的 @Service注解的实例是没有经过事务加强处理,即没有事务处理能力的Service,而父容器进行初始化的Service是保证事务的增强处理能力 的。如果不在子容器中将Service exclude掉,此时得到的将是原样的无事务处理能力的Service,因为在多上下文的情况下,如果同一个bean被定义两次,后面一个优先。 -
最后,原因很可能就是上面提到的,剩下的工作就是实践了
修改spring-mvc.xml
<!-- 自动扫描controller包下的所有类,如果@Controller注入为bean --> <context:component-scan base-package="com.sds"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> 或者再 context:component-scan中添加一个属性 use-default-filters="false" 否则默认扫描包下所有
修改spring-common.xml (applicationContext.xml)<!--自动扫描含有@Service将其注入为bean --> <context:component-scan base-package="com.sds"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>
修改spring-mybatis.xml
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> </tx:attributes> </tx:advice> <!-- Spring aop事务管理 --> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* com.sds..*service.*.*(..))" /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" /> </aop:config>
- 再次测试验证修改的结果:数据库事务起作用了。
相关推荐
3. **配置Spring**:在src/main/resources下创建applicationContext.xml文件,配置Spring的核心容器,包括Bean定义、数据源、事务管理器等。例如,使用DataSource来连接Oracle数据库,使用...
在IT行业中,构建一个高效、可维护的企业级Web应用程序常常会采用MVC(Model-...通过这样的配置,开发者可以快速构建起一个基于Spring MVC、Spring和MyBatis的Web应用,同时利用Maven的便利性进行项目的构建和管理。
SSM(Spring MVC + Spring + MyBatis)是Java Web开发中常见的三层架构组合,它将Spring MVC作为表现层框架,Spring作为业务层容器,MyBatis作为数据访问层框架。下面将详细介绍这三个组件以及它们如何协同工作。 *...
将SpringMVC、Spring和SpringJDBC整合,首先需要配置Spring的IoC容器,定义数据源、事务管理器以及SpringMVC的配置。这通常通过XML配置文件或者Java配置类来实现。 接着,创建SpringMVC的Controller,定义处理HTTP...
3、搭建Spring配置:spring.xml(扫描service),config.properties,log4j.properties; 4、搭建spring和mybatis的配置:spring-mybatis.xm(扫描dao)) 5、测试Spring+mybatis的框架搭建,写单元测试JUnit,测试事务配置...
总结来说,本项目是一个基础的Web开发框架,结合了SpringMVC的MVC设计模式、Spring Data JPA的数据访问层、Hibernate的ORM能力以及FreeMarker的模板引擎,同时还实现了环境配置的灵活切换,为开发高效、可维护的Web...
在IT行业中,SpringMVC、Spring和Mybatis是三大核心框架,它们的集成使用...在压缩包文件"SpringMVC_Spring_mybatis"中,可能包含了这些框架的配置文件、样例代码和项目结构,为开发者提供了一个快速入门和学习的环境。
在SpringMVC+Spring+Ibatis的架构中,多数据源配置是一项重要特性。这允许应用连接到多个数据库,根据业务需求选择合适的数据库进行操作。在Spring中,可以通过DataSourceRouter或AbstractRoutingDataSource实现动态...
4. **配置文件**:配置struts.xml、spring-context.xml和hibernate.cfg.xml等核心配置文件,定义组件、bean、数据源、事务管理器等。 5. **实体类和映射文件**:创建Java实体类并编写对应的Hibernate映射文件(.hbm....
开发者可以通过配置文件或注解来声明Bean及其依赖关系,Spring会自动管理这些Bean,提供事务管理、安全控制等多种服务。 MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。与传统的JDBC...
在Spring配置文件中,可以通过bean定义来管理对象的生命周期和依赖关系。 Hibernate作为Java领域广泛使用的ORM工具,允许开发者用Java对象来操作数据库,避免了直接编写SQL语句的繁琐。Hibernate通过XML映射文件或...
本文主要讲述了SpringMVC、Spring和Mybatis框架的技术分享,涵盖了框架的组织结构、必要的JAR包、框架的配置文件、数据源管理、事务管理、AOP方面的配置等。 一、框架组织结构 在SpringMVC+Spring+Mybatis框架中,...
在整合SSM(SpringMVC+Spring+Mybatis)的过程中,通常会使用Spring的配置文件(如applicationContext.xml)来配置Spring和Mybatis的bean,包括数据源、事务管理器、SqlSessionFactory等。同时,还需要在SpringMVC的...
在提供的压缩包中,文件可能包括Spring、SpringMVC和MyBatis的jar包,以及相关的配置文件,例如spring-context.xml、web.xml、mybatis-config.xml、Mapper接口和XML文件等。这些文件是整合SSM框架的关键,通过它们...
在这个项目中,Spring可能用于配置和管理数据库连接、事务以及服务层组件。 3. **HBase**:HBase是一个非关系型数据库,基于Google的Bigtable设计,是Apache Hadoop生态系统的一部分。它提供高并发、低延迟的数据...
在IT领域,Spring MVC、Spring、MyBatis和Maven是四个非常重要的开源框架和工具,它们在构建Java Web应用程序时发挥着核心作用。这里,我们将深入探讨这四大组件及其在实际项目中的应用。 首先,Spring框架是Java...
DI允许我们通过配置文件或注解来管理对象及其依赖关系,而AOP则允许我们在不修改原有代码的情况下,插入额外的功能,如日志记录、事务管理等。Spring还提供了数据访问抽象,如JdbcTemplate和HibernateTemplate,与...
本教程源码涵盖了整合过程中的各种配置文件,如web.xml(SpringMVC的配置),spring-servlet.xml(SpringMVC的 DispatcherServlet配置),applicationContext.xml(Spring的全局配置),mybatis-config.xml(Mybatis...
Spring MVC、Spring 和 MyBatis 是Java开发中常用的三大框架,它们共同构成了一个高效、灵活的企业级应用开发体系。在本项目中,这三个框架通过 Maven 进行了整合,使得项目的构建、依赖管理和模块化更加方便。下面...