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

问题描述

在用springmvc时,用到了spring事务管理<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>true</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><!--通过AOP配置提供事务增强,让service包下所有Bean的所有方法拥有事务--><aop:configproxy-target-class="true"><aop:pointcutid="serviceMethods"expression="execution(*app.com.*.service..*.*(..))"/>*<aop:advisorpointcut-ref="serviceMethods"advice-ref="txAdvice"/></aop:config><tx:adviceid="txAdvice"transaction-manager="transactionManager"><tx:attributes><tx:methodname="add*"propagation="REQUIRED"rollback-for="Exception"/><tx:methodname="edit*"propagation="REQUIRED"rollback-for="Exception"/><tx:methodname="remove*"propagation="REQUIRED"rollback-for="Exception"/><tx:methodname="save*"propagation="REQUIRED"rollback-for="Exception"/><tx:methodname="update*"propagation="REQUIRED"rollback-for="Exception"/><tx:methodname="delete*"propagation="REQUIRED"rollback-for="Exception"/><tx:methodname="batchUpdate"propagation="REQUIRED"rollback-for="Exception"/><tx:methodname="*"read-only="true"/></tx:attributes></tx:advice>上面事务配置我理解的意思是:通过springaop配置让工程service包下的所有以add、edit、save、update等开头的方法对其自动的事务提交、回滚在service包下有个方法我是这样写的:packageapp.com.test.service;@RepositorypublicclassTestServiceImplimplementsTestService{@AutowiredprivateTestJdbcDAOtestJdbcDAO;publicvoidsaveTest()throwsException{Stringsql1="insertintoATTACHINFO(id,name)values(1,'test1')";testJdbcDAO.update(sql1);Stringsql2="insertintoATTACHINFO(id1,name)values(2,'test2')";//错误sql语句testJdbcDAO.update(sql2);}执行这个方法中,sql1是正确的,sql2是错误的,执行完在数据库中看到第一条数据插入进去了。我理解的是两条数据都不会入库,会进行事务回滚。这挺让我费解的,求大神指教

解决方案

解决方案二:
你第一次update的时候是一个完整的事务,执行完后就commit了,第二次update时是一个新的事务,和第一个事事务完全没关系
解决方案三:
那配置了spring事务管理有什么用?我把这个配置去掉,还是以上的结果
解决方案四:
引用1楼aazbc的回复:

你第一次update的时候是一个完整的事务,执行完后就commit了,第二次update时是一个新的事务,和第一个事事务完全没关系

那配置了spring事务管理有什么用?我把这个配置去掉,还是以上的结果
解决方案五:
maek一下看看其实我配置的就是都回滚,等大神,
解决方案六:
引用4楼boybaozi的回复:

maek一下看看其实我配置的就是都回滚,等大神,

你怎么配置的,让它们都回滚
解决方案七:

解决方案八:
rollback-for="Exception"去掉
解决方案九:
在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。Spring中也有自己的事务管理机制,使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
解决方案十:
断点到TransactionInterceptor类的invoke方法,再执行saveTest确认aop配置是否正确
解决方案十一:
是不是顺序写反了。。tx和aop
解决方案十二:
引用8楼baohuan_love的回复:

在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。Spring中也有自己的事务管理机制,使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。

那把defaultAutoCommit设置为false后,在代码中每次保存操作都要用commit方法,那么配置txaop的的增强事务有什么作用?
解决方案十三:
引用10楼Gu31415的回复:

是不是顺序写反了。。tx和aop

不是顺序写反了的问题的
解决方案十四:
引用9楼whos2002110的回复:

断点到TransactionInterceptor类的invoke方法,再执行saveTest确认aop配置是否正确

没进入断点;<aop:pointcutid="serviceMethods"expression="execution(*app.com.*.service..*.*(..))"/>*对应扫描包packageapp.com.test.service;应该没问题吧;还需要配置什么?
解决方案十五:
如果事务配置成功的话,方法里两条insert都不会成功执行的,是不是扫描包的问题?在spring和springMVC配置文件中,扫描包是怎么配置的?还有web容器启动的时候,这两个配置文件的加载顺序是怎样的?
解决方案:
扫描包的配置execution(*app.com.*.service..*.*(..))改为execution(*app.com.*.service..*(..))试试,是不是多了一层
解决方案:
引用15楼jiiiang400的回复:

扫描包的配置execution(*app.com.*.service..*.*(..))改为execution(*app.com.*.service..*(..))试试,是不是多了一层

改成你这样也没用啊
解决方案:
Spring的事务没有问题,既然不起作用,只能是你的配置有问题!对于这一串execution,对照着Spring官网配置,能出问题吗?另外,都啥年代了,还用这种方式来配置事务!建议使用注解方式配置事务,简单、快捷、灵活!
解决方案:
虽然没有得到具体是什么原因,但还是非常感谢大家的帮助,这个问题本人已经解决了;原因是因为我这里是用来springmvc,在配spring注解的时候出现问题如下:在主容器中(applicationContext.xml),将Controller的注解排除掉在springMVC配置文件中将Service注解给去掉(我之前没加这个)<context:component-scanbase-package="com"><context:include-filtertype="annotation"expression="org.springframework.stereotype.Controller"/><context:exclude-filtertype="annotation"expression="org.springframework.stereotype.Service"/></context:component-scan>因为spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。还有一种方式是将service层改用xml配置,其实这样做也是变相的让springmvc无法扫描service,而只能依赖父窗口也就是ServletContextListener来进行初始化,这样同样被赋予了事务性。
解决方案:
引用17楼crazypandariy的回复:

Spring的事务没有问题,既然不起作用,只能是你的配置有问题!对于这一串execution,对照着Spring官网配置,能出问题吗?另外,都啥年代了,还用这种方式来配置事务!建议使用注解方式配置事务,简单、快捷、灵活!

注解?你确定spring注解配置事务比这种aop的方式更加方便?这个我到是不赞同!
解决方案:
很明显,实际中都是在xml中配置事物

时间: 2024-08-20 00:45:28

spring 事务管理让我费解的地方的相关文章

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)

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

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

spring事务管理的一些注意点

总结一些自己最近在使用spring事务管理时碰到的一些注意点   一.关于目标对象内部方法自我调用时的一些情形和存在的问题 1.情形1:只给b方法上加事务注解,a方法上不加 目标类的接口和实现代码示例: public interface AService {     public void a();     public void b(); }   @Service() public class AServiceImpl implements AService{     public void

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

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

并发-mybatis spring事务管理问题

问题描述 mybatis spring事务管理问题 mybatis把一个对象查询出来,让后在对这个对象做相关业务操作,然后再保存这个对象, 这样有个问题就是,在并发情况下,这个对象不是数据库最新的数据,有方法可以避免吗? 解决方案 在对象查询前面做一次对象状态更新,标记正要更新的状态.然后再查询出来,做业务操作,保存时把标记复原. 解决方案二: 可以加锁,或者线程,锁住对象就行了 解决方案三: 可以加锁,或者线程,锁住对象就行了

Spring事务管理只对出现运行期异常进行回滚_java

一.结论 Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚. 如果一个方法抛出Exception或者Checked异常,Spring事务管理默认不进行回滚. 关于异常的分类一下详细介绍: 1.基本概念 看java的异常结构图  Throwable是所有异常的根,java.lang.Throwable Error是错误,java.lang.Error Exception是异常,java.lang.Exception 2.Excep

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

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

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

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