为什么配置的spring事务管理没有效果

问题描述

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd"default-lazy-init="true"><!--====================================================加载属性文件===============================================--><beanid="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><propertyname="locations"><list><value>classpath:jdbc.properties</value></list></property></bean><!--配置数据源,用了dbcp数据库连接池--><beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><propertyname="driverClassName"><value>${jdbc.driver}</value></property><propertyname="url"><value>${jdbc.url}</value></property><propertyname="username"><value>${jdbc.username}</value></property><propertyname="password"><value>${jdbc.password}</value></property><propertyname="maxActive"><value>${maxActive}</value></property><propertyname="maxWait"><value>${maxWait}</value></property><propertyname="maxIdle"><value>${maxIdle}</value></property><propertyname="removeAbandoned"><value>${removeAbandoned}</value></property><propertyname="removeAbandonedTimeout"><value>${removeAbandonedTimeout}</value></property><propertyname="validationQuery"><value>${validationQuery}</value></property><!--propertyname="defaultAutoCommit"><value>false</value></property--></bean><!--配置Jdbc模板--><beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><propertyname="dataSource"ref="dataSource"/></bean><!--配置事务管理器p:dataSource-ref="dataSource"/>--><beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/></bean><tx:adviceid="txAdvice"transaction-manager="transactionManager"><tx:attributes><tx:methodname="add*"propagation="REQUIRED"/><tx:methodname="edit*"propagation="REQUIRED"/><tx:methodname="remove*"propagation="REQUIRED"/><tx:methodname="save*"propagation="REQUIRED"/><tx:methodname="update*"propagation="REQUIRED"/><tx:methodname="delete*"propagation="REQUIRED"/><tx:methodname="batchUpdate"propagation="REQUIRED"/><tx:methodname="*"read-only="true"/></tx:attributes></tx:advice><!--通过AOP配置提供事务增强,让service包下所有Bean的所有方法拥有事务--><aop:configproxy-target-class="true"><aop:pointcutid="serviceMethods"expression="execution(*app.com.th.db.service.*.*(..))"/><aop:advisorpointcut-ref="serviceMethods"advice-ref="txAdvice"/></aop:config>

packageapp.com.th.db.service;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importapp.com.th.db.dao.supJdbcDAO;importnet.sf.json.JSON;importnet.sf.json.JSONSerializer;importorg.json.JSONArray;importorg.json.JSONException;importorg.json.JSONObject;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.stereotype.Repository;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;@RepositorypublicclassSupServiceImplimplementsSupService{@AutowiredprivateSupJdbcDAOsupJdbcDAO;publicvoidsaveSup()throwsException{//情况1:defaultAutoCommit设置为trueStringsql1="insertintoATTACHINFO(ATTACHID,ATTACHNAME)values(1,'test1')";supJdbcDAO.execute(sql1);Stringsql2="insertintoATTACHINFO(ATTACHID,ATTACHNAME1)values(2,'test2')";//错误语句supJdbcDAO.execute(sql2);/**情况2:defaultAutoCommit设置为falseStringsql1="insertintoATTACHINFO(ATTACHID,ATTACHNAME)values(1,'test1')";supJdbcDAO.execute(sql1);Stringsql2="insertintoATTACHINFO(ATTACHID,ATTACHNAME)values(2,'test2')";supJdbcDAO.execute(sql2);*/}}

执行这个saveSup方法中,情况1是我把defaultAutoCommit设置为true后自动提交sql1是正确的,sql2是错误的,执行完在数据库中看到第一条数据插入进去了。怎么进行事务回滚。情况2是我把defaultAutoCommit设置为false关闭自动提交执行完后,数据没有插入进去情况1不进行事务回滚;情况2事务没提交<aop:pointcutid="serviceMethods"expression="execution(*app.com.th.db.service.*.*(..))"/>切入点没问题啊配置的tx和aop怎么没作用了?

解决方案

解决方案二:
用springmvc的话,看看这里:https://github.com/springside/springside4/wiki/Spring-MVC
解决方案三:
程序里抛出newRuntimeException();试试
解决方案四:
引用2楼lilei19lilei29的回复:

程序里抛出newRuntimeException();试试

还是一样
解决方案五:
不知道你配置的对不,我都是注解配置,加个@Transaction
解决方案六:
引用4楼lilei19lilei29的回复:

不知道你配置的对不,我都是注解配置,加个@Transaction

那这样的话需要在每个方法前加这个注解比较麻烦了
解决方案七:
是不是要了出现EXCEPTION,回滚的配置<propkey="add*">PROPAGATION_REQUIRED,-Exception</prop>

时间: 2024-08-17 20:22:37

为什么配置的spring事务管理没有效果的相关文章

spring 事务管理让我费解的地方

问题描述 在用springmvc时,用到了spring事务管理<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><propertyname="driverClassName"><value>${jdbc.driver}</value></prop

Spring 事务管理高级应用难点剖析: 第 3 部分

本文是"Spring 事务管理高级应用难点剖析" 系列文章的第 3 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括在使用 Spring JDBC 时如果直接获取 Connection,哪些情况会造成数据连接的泄漏与如何应对,以及除 Spring JDBC 外,其它数据访问技术数据连接泄漏的应对方案.   概述 对于应用开发者来说,数据连接泄漏无疑是一个可怕的梦魇.如果存在数据连接泄漏问题,应用程序将因数据连接资源的耗尽而崩溃,甚至还可能引起数据库的

Spring事务管理高级应用难点剖析: 第2部分

联合军种作战的混乱 Spring 抽象的 DAO 体系兼容多种数据访问技术,它们各有特 色,各有千秋.像 Hibernate 是非常优秀的 ORM 实现方案,但对底层 SQL 的控制不太方便: 而 iBatis 则通过模板化技术让您方便地控制 SQL,但没有 Hibernate 那样高的开发效率:自 由度最高的当然是直接使用 Spring JDBC 莫属了,但是它也是最底层的,灵活的代价是代码的 繁复.很难说哪种数据访问技术是最优秀的,只有在某种特定的场景下,才能给出答案.所以 在一个应用中,往

Spring事务管理--多个ORM框架在使用时的情况分析

   公司的项目已经接近尾声了,总结一下项目中用到的技术,我发现项目中的有些东西还是挺模糊的,只是知道这么用就行了.并不清楚其中的原理.由于公司的项目比较老,是7年前的一个项目了,中间一直有人在维护,也是在这个过程中不断融入了新的东西,比如就项目的持久化这块来说,就用了ibatis.mybatis.hibernate.spring JDBC四种混合的框架.究其原因只能说是历史遗留问题,就不做过多的解释了.但是这么多持久化的框架如何协同工作的,尤其是事务的控制,一个系统中使用如此多的持久化框架是,

Spring事务管理回顾——基本概念

BackGround:            最近一直在面试,感觉spring的事务配置问的挺多的,再扯出来好好瞅瞅,争取做到秒杀面试官. 一,事务的基本概念        什么是事务?               逻辑上的一组操作,这组操作要么全都成功,要么全都失败.例如,我购买完一个课程,要进行支付,需要首先去我的账户表中减去需要支付的金额,然后更新订单状态,支付才算是成功,那么支付跟更新订单状态就要放在一个事务里面执行,要么全成功,要么全失败,不能出现那种我买了课程,结果订单还显示我未支付

Spring 事务管理高级应用难点剖析: 第 2 部分

本文是"Spring 事务管理高级应用难点剖析" 系列文章的第 2 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括混合使用多种数据访问技术(如 Spring JDBC + Hibernate)的事务管理问题,以及通过 Spring AOP 增强的 Bean 存在的一些比较特殊的情况. 联合军种作战的混乱 Spring 抽象的 DAO 体系兼容多种数据访问技术,它们各有特色,各有千秋.像 Hibernate 是非常优秀的 ORM 实现方案,但对底层

Spring 事务管理高级应用难点剖析: 第 1 部分

Spring 的事务管理是被使用得最多的功能之一,虽然 Spring 事务管理已经帮助程序员将要做的事情减到了最小.但在实际开发中,如果使用不当,依然会造成数据连接泄漏等问题.本系列以实际应用中所碰到的各种复杂的场 景为着眼点,对这些应用的难点进行深度的剖析. DAO 和事务管理的牵绊 很少有使用 Spring 但不使用 Spring 事务管理器的应用,因此常常有人会问:是否用了 Spring,就一定要用 Spring 事务管理器,否则就无法进行数据的持久化操作呢?事务管理器和 DAO 是什么关

Spring事务管理高级应用难点剖析,第1部分

概述 Spring 最成功,最吸引人的地方莫过于轻量级的声明式事务管理,仅此一点,它就宣告了 重量级 EJB 容器的覆灭.Spring 声明式事务管理将开发者从繁复的事务管理代码中解脱出来 ,专注于业务逻辑的开发上,这是一件可以被拿来顶礼膜拜的事情.但是,世界并未从此消停 ,开发人员需要面对的是层出不穷的应用场景,这些场景往往逾越了普通 Spring 技术书籍的 理想界定.因此,随着应用开发的深入,在使用经过 Spring 层层封装的声明式事务时,开发 人员越来越觉得自己坠入了迷雾,陷入了沼泽,

分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager

1 系列目录 分布式事务系列(开篇)提出疑问和研究过程 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析 分布式事务系列(1.2)Spring事务体系 分布式事务系列(2.1)分布式事务模型与接口定义 分布式事务系列(3.1)jotm的分布式案例 分布式事务系列(3.2)jotm分布式事务源码分析 分布式事务系列(4.1)Atomikos的分布式案例 2 jdbc事务 2.1 例子 public void save(User user)