spring 事务回滚问题

问题描述

我有2个DAO分别是IndepotOrderDao和InDepotRecordDao都继承JdbcDaoSupportpublicclassIndepotOrderDaoImplextendsJdbcDaoSupport{saveInDepotOrder(IndepotOrderindepotOrder){sql="insertintoindepotOrder(name)value(?)";Object[]args={"orderName"};this.getJdbcTemplate().update(sql,args);}updateInDepotOrder(IndepotOrderindepotOrder){sql="updateindepotOrdersetname=?";Object[]args={indepotOrder.getName()};this.getJdbcTemplate().update(sql,args);}}publicclassInDepotRecordDaoImplextendsJdbcDaoSupport{saveInDepotRecord(InDepotRecordinDepotRecord){sql="insertintoinDepotRecord(name)value(?)";Object[]args={inDepotRecord.getName()};this.getJdbcTemplate().update(sql,args);}updateInDepotRecord(IndepotOrderinDepotRecord){sql="updateinDepotRecordsetname=?";Object[]args={inDepotRecord.getName()};this.getJdbcTemplate().update(sql,args);}}Service调用这两个daopublicClassIndepotServiceImp{@ResourceprivateIndepotOrderDaoindepotOrderDao;@ResourceprivateInDepotRecordDaoinDepotRecordDao;//方法1@Transactionalpublicvoidadd(IndepotOrderindepotOrder,InDepotRecordinDepotRecord){indepotOrderDao.saveInDepotOrder(indepotOrder);//(1)inDepotRecordDao.saveInDepotRecord(inDepotRecord);//(2)}//方法2inDepotRecordvoidupdate(IndepotOrderindepotOrder,InDepotRecordinDepotRecord){indepotOrderDao.updateInDepotOrder(indepotOrder);//(1)inDepotRecordDao.updateInDepotRecord(inDepotRecord);//(2)}}

spring事务管理器配置如下<!--配置dataSource事务管理器--><beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/></bean><!--开启注释扫描事务功能--><tx:annotation-driventransaction-manager="transactionManager"/>

方法1中的(1)(2)任意一个发生异常数据库都不会有记录插入而且异常会打印到web页面中方法2中如果(1)发生异常(2)还会执行并把数据库中的记录更新了异常打印在控制台里请教:如何让方法2也像方法一那样呢?(1)(2)中有一个发生异常就都不执行难道spring对数据库update和insert处理级别不一样

解决方案

解决方案二:
//方法1@Transactionalpublicvoidadd(IndepotOrderindepotOrder,InDepotRecordinDepotRecord){indepotOrderDao.saveInDepotOrder(indepotOrder);//(1)inDepotRecordDao.saveInDepotRecord(inDepotRecord);//(2)}//方法2这里不用写注解吗?inDepotRecordvoidupdate(IndepotOrderindepotOrder,InDepotRecordinDepotRecord){indepotOrderDao.updateInDepotOrder(indepotOrder);//(1)inDepotRecordDao.updateInDepotRecord(inDepotRecord);//(2)}

注解的事务我没用过不过看你写的2个方法也不一样呀?
解决方案三:
写我这上面我忘写了
解决方案四:
我看几个方法的最大区别也是sql变量内容不同,我对spring也不熟,我觉得spring不太可能对这方面会有所区别对待还是要跟进查清异常发生的地点,不同原因导致的异常可能最终表现也不尽相同吧
解决方案五:
异常抛出的都是org.springframework.dao.DataIntegrityViolationException的时候执行insert异常直接抛到页面上去执行update异常在控制台里被抛出
解决方案六:
引用4楼zelig_zzy的回复:

异常抛出的都是org.springframework.dao.DataIntegrityViolationException的时候执行insert异常直接抛到页面上去执行update异常在控制台里被抛出

如果是这样的话,那有可能是区别对待的,对于某类异常,捕捉到后投送到页面(认为对使用者重要,特意告知),并且中断执行流程对于其它某类异常,直接捕捉,不进行特殊处理,只是在控制台告示,并不中断流程,这类区别能查到吗
解决方案七:
如果是unchecked异常,自动回滚.如果要回滚checked异常,@Transactional(rollbackFor={CheckedException.class}).Spring文档有详细说明
解决方案八:
DataIntegrityViolationException异常的父类就是runtimeException是unchecked类型的这个我加了不好用@Transactional(rollbackFor=Exception.class)我感觉spring容器update(){update1();update2();}展开后为update(){try{update1();}catch(Exceptione){rollback();e.print();}finally{.....}try{update2();}catch(Exceptione){rollback();e.print().}finally{.....}}如果要是这样update(){try{update1();update2();}catch(Exceptione){rollback();e.print();}finally{.....}}就应该没问题
解决方案九:
我感觉这2个update方法根本就没在一个事务中
解决方案十:
引用8楼zelig_zzy的回复:

我感觉这2个update方法根本就没在一个事务中

要不你别用注解了在service层加上事务就行了
解决方案十一:
因为只给方法一配了事务管理。
解决方案十二:
不知道我什么时候才能达到这样的水平
解决方案十三:
该回复于2011-01-30 09:54:40被版主删除
解决方案十四:
第二个方法上面有@Transactional吗?看看

时间: 2024-10-07 17:51:44

spring 事务回滚问题的相关文章

spring事务回滚只能配在service层吗。为什么我想在Test中添加事务不能进行回滚呢

问题描述 spring事务回滚只能配在service层吗.为什么我想在Test中添加事务不能进行回滚呢 <tx:advice id="txAdvice2" transaction-manager="txManager"> <tx:attributes> <tx:method name="inserttwo*" propagation="REQUIRED"/> </tx:attribut

spring 事务 回滚-spring @Transactional 事务不能回滚

问题描述 spring @Transactional 事务不能回滚 在spring的配置文件里配置如下: <!-- enable the configuration of transactional behavior based on annotations --> <tx:annotation-driven transaction-manager="txManager"/> <!-- a PlatformTransactionManager is sti

spring 事务回滚

问题描述 @Transactionalpublic Map routSave(RoutFormBean routbean) throws Exception{ Map result=new HashMap();StringBuffer sb=new StringBuffer();sb.append("delete from WfNrouteTbl where nrountePk.dnp_kbn='");sb.append(routbean.getDnp());sb.append(&qu

Spring 事务回滚失败

问题描述 applicationContext.xml中配置:......<aop:config><aop:pointcut id="servicesPointcut" expression="execution(* *.impl.service.*.*(..))" /><aop:advisor advice-ref="txAdvice" pointcut-ref="servicesPointcut&quo

spring的事务回滚策略为自定义异常

问题描述 spring的事务回滚策略为自定义异常 我配置的回滚策略如下 BusinessException是个自定义异常,继承了RuntimeException,按道理来说spring应该是捕捉到这个异常类或这个异常类的子类才进行的回滚,但是为什么抛出RuntimeException以后事务还是会回滚? 解决方案 http://shaohan126448.iteye.com/blog/1536879 解决方案二: spring异常与事务回滚Spring异常抛出触发事务回滚策略异常类型 &&

ThinkPHP实现事务回滚示例代码_php实例

ThinkPHP的事务回滚示例如下: $m=D('YourModel');//或者是M(); $m2=D('YouModel2'); $m->startTrans();//在第一个模型里启用就可以了,或者第二个也行 $result=$m->where('删除条件')->delete(); $result2=m2->where('删除条件')->delete(); if($result && $result2){ $m->commit();//成功则提交

spring 注解事务回滚问题

问题描述 spring 注解事务回滚问题 ,错误异常是数据库表主键不可重复,控制台报了违反了表的约术,但是SPring却不回滚..项目能正常运行.用的是注解. 解决方案 看看这里http://my.oschina.net/xuqiang/blog/97633

插入多条数据回滚-hibernate 手动控制事务回滚失败

问题描述 hibernate 手动控制事务回滚失败 spring配置: 5201005100 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" />

在Java的JDBC使用中设置事务回滚的保存点的方法_java

新的JDBC3.0保存点的接口提供了额外的事务控制.他们的环境中,如Oracle的PL/ SQL中的大多数现代的DBMS支持保存点. 当设置一个保存点在事务中定义一个逻辑回滚点.如果发生错误,过去一个保存点,则可以使用rollback方法来撤消要么所有的改变或仅保存点之后所做的更改. Connection对象有两个新的方法,可帮助管理保存点: setSavepoint(String savepointName): 定义了一个新的保存点.它也返回一个Savepoint 对象. releaseSav