以前做过的一个spring mvc框架的配置,最开始的时候全部是xml配置,事务管理没有问题,用的是拦截器那种。现在修改框架,为了使用方便,修改了配置文件,发现事物管理不好用了,求大神赐教。
我输出注入action的service,看到控制台的信息不是代理类的信息,是service本身类信息(LoginServiceImpl@19b4c30)。说明,事务没有加入到service。
也不想全部使用annonation,这样开发的时候,还需要给类或者方法追加annonation标记。
xml如下:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd "> <context:property-placeholder location="classpath:properties/jdbc.properties"/> <!-- データソース --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.userName}" p:password="${jdbc.password}" p:maxActive="100" p:maxIdle="30" p:maxWait="500" p:defaultAutoCommit="false"/> <!-- トランザクション マネジャー --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="del*, delete*" propagation="REQUIRED" read-only="false" isolation="READ_COMMITTED" rollback-for="Exception"/> <tx:method name="upd*, update*" propagation="REQUIRED" read-only="false" isolation="READ_COMMITTED" rollback-for="Exception"/> <tx:method name="ins*, insert*" propagation="REQUIRED" read-only="false" isolation="READ_COMMITTED" rollback-for="java.lang.RuntimeException"/> <tx:method name="find*, get*, select*" propagation="SUPPORTS" isolation="READ_COMMITTED"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="serviceMethod" expression="execution(* app.*.service..*(..))"/> <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/> </aop:config> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" p:dataSource-ref="dataSource" p:configLocation="classpath:common/mybatis/config/mybatisConfig.xml" p:mapperLocations="classpath:common/mybatis/xml/*.xml" p:typeAliasesPackage="common.mybatis.entity"/> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" p:basePackage="common.mybatis.dao"/> <context:component-scan base-package="app"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/> <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> </beans>
在DispatcherServlet的启动文件里面
<context:component-scan base-package="app"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan>
注入action的service肯定是applicationContext.xml里面。
package结构如下
/src/app/login/service/LoginService.java
/src/app/login/service/impl/LoginServiceImpl.java
package app.login.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import app.login.service.LoginService; import common.mybatis.dao.TestMapper; import common.mybatis.entity.Test; @Service @Transactional public class LoginServiceImpl implements LoginService { @Autowired private TestMapper testMapper; @Override public int insertA() throws Exception { System.out.println(); System.out.println(testMapper); Test record = new Test(); record.setUserName("01"); record.setPassword("01"); testMapper.insert(record); if (1 == 1) { throw new RuntimeException(); } record = new Test(); record.setUserName("02"); record.setPassword("02"); testMapper.insert(record); return 0; } }
我测试的时候
第一次
testMapper.insert(record);
执行 以后db就有已经插入数据了。
抛出异常后没有回滚
--2013/4/26已解决
配置切面的时候:
<tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="del*, delete*" propagation="REQUIRED" read-only="false" isolation="READ_COMMITTED" rollback-for="Exception"/> <tx:method name="upd*, update*" propagation="REQUIRED" read-only="false" isolation="READ_COMMITTED" rollback-for="Exception"/> <tx:method name="ins*, insert*" propagation="REQUIRED" read-only="false" isolation="READ_COMMITTED" rollback-for="java.lang.RuntimeException"/> <tx:method name="find*, get*, select*" propagation="SUPPORTS" isolation="READ_COMMITTED"/> </tx:attributes> </tx:advice>
name中不能用逗号
<tx:method name="del*, delete*" propagation="REQUIRED" read-only="false" isolation="READ_COMMITTED" rollback-for="Exception"/>
相关推荐
基于这样的背景下,我开源了本示例项目,方便大家快速上手Spring Boot、Spring Cloud 。 每个示例都带有详细的介绍文档、作者在使用过程中踩过的坑、解决方案及参考资料,方便快速上手为你提供学习捷径,少绕弯路...
Chinese translation of the Spring Framework 4.x Reference Documentation (http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/) .中文翻译《Spring Framework 4.x参考文档》 — ...
monkeyk7/spring-oauth-clientmonkeyk7/spring-oauth-clientmonkeyk7/spring-oauth-clientmonkeyk7/spring-oauth-clientmonkeyk7/spring-oauth-clientmonkeyk7/spring-oauth-clientmonkeyk7/spring-oauth-...
3.2.7/mybatis-spring-1.2.2/mysql-connector-java-5.1.7-bin/slf4j-api-1.7.5/slf4j-log4j12-1.7.5/spring-aop-4.1.3.RELEASE/spring-aspects-4.1.3.RELEASE/spring-beans-4.1.3.RELEASE/spring-context-4.1.3....
spring-boot2.0全新教程实例20例.zip - [spring-boot-helloWorld](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-helloWorld):Spring Boot 的 hello World 版本 - [spring-boot-...
spring-ai-core 0.8.1,解决大家使用2023.0.1.0 版本 Spring Cloud Alibaba 依赖,代码依赖下载报错问题, <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId>...
这个就不再详述,具体请看下面,经过详细排查,终于分析完毕相关包的作用,并整理完一套完整的包(由于大小问题没有上传,附图): struts2的包必须版本一致 不能即用2.1.6的包 又用到了2.1.8的包 ,其他版本类似...
logback与spring集成的文件,从官网上找的。上传的文件包括源文件和jar包,以下是连接: https://github.com/qos-ch/logback-extensions/wiki/Spring ...
- [springcloud(十七):服务网关 Spring Cloud GateWay 熔断、限流、重试](http://www.ityouknow.com/springcloud/2019/01/26/spring-cloud-gateway-limit.html) 综合篇: - **[Spring Cloud在国内中小型公司...
2013/03/21 18:20 126,740 spring-context-support-3.2.0.RC2.jar 2013/03/21 18:20 863,315 spring-core-3.2.0.RC2.jar 2013/03/21 18:20 193,557 spring-expression-3.2.0.RC2.jar 2013/03/21 18:20 400,914 ...
spring使用logback的扩展,使用起来非常方便。在web.xml中配置: <context-param> <param-name>logbackConfigLocation</param-name> <param-value>/WEB-INF/conf/logback.xml</param-value> </context-param> ...
spring整合mybatis。/13spring4_mybatis2/lib/aopalliance.jar /13spring4_mybatis2/lib/asm-3.3.1.jar /13spring4_mybatis2/lib/aspectjweaver.jar .../13spring4_mybatis2/lib/spring-webmvc-4.1.6.RELEASE.jar
这里提到的 "spring-framework-3.0.5.RELEASE-with-docs.zip" 和 "spring-framework-3.0.5.RELEASE-dependencies.zip" 是 Spring 框架3.0.5版本的两个不同部分。 首先,"spring-framework-3.0.5.RELEASE-with-docs....
spring data jpa的包。spring-data-commons-1.8.0.RELEASE.jar
Spring Framework 4.2.5 是一个里程碑式的版本,在Java企业级应用开发中扮演着核心角色。这个框架提供了丰富的功能,包括依赖注入、面向切面编程(AOP)、数据访问、Web开发、集成测试和更多。以下是这个版本的一些...
同时使用了Struts2、Spring4、Hibernate4、log4j、slf4j、junit4、ehcache等库或框架,搭建一个最基本的项目原型。 三、 三大框架最新版本下载:截止2014-10-01 Struts2.3.6:发布于2014-05-03,目前的最新版本。...
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
在`spring-servlet.xml`中配置事务管理器,并在需要的Service类上添加`@Transactional`注解: ```xml <tx:annotation-driven transaction-manager="transactionManager"/> ...
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理应用中的事务。Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何...
Spring Dynamic Modules(Spring-DM,现在已经被Spring OSGi取代)提供了一种方式来处理这种情况,它可以帮助我们在OSGi环境中创建透明的Spring事务代理。 此外,我们需要确保所有涉及事务的服务都在同一个...