问题描述
我有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吗?看看