spring事物配置问题,没有回滚,请大侠没赐教

<!--配置事物管理--><beanid="transactionManager"class="org.springframework.jdbc.datasource.D... <!--配置事物管理--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource_test"/> </bean> <!-- 配置事务传播特性 --> <tx:advice id="TestAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="*" propagation="REQUIRED" rollback-for="RuntimeException"/> </tx:attributes> </tx:advice> <!-- 切入点配置 --> <aop:config> <aop:pointcut id="allTestServiceMethod" expression="execution(* com.web.yx.service.*.*(..))"/> <aop:advisor pointcut-ref="allTestServiceMethod" advice-ref="TestAdvice" /> </aop:config>
--------------------------------------------代码好看上面内容截图----------------------------------

----------------------------------------------------------------------------------------------------------
service测试:
补充:上面代码执行结果是updateDate成功,后面就抛了空指针异常了,saveDate没执行了。

再次补充问题:我也不知道能不能正面【天空的疆域】的说法。
我做过两个这样的测试,数据库加一个唯一约束,
1、然后两次调用saveDate(testModel),这样回滚是正常的。
2、先updateDate(2),然后saveDate 与updateData值相同的,这样也回滚正常。

如果【天空的疆域】说的对,是不是有某个配置,可以把多个事物整合到一个事物里面,从而实现整体回滚。

我理解事物就是整个流程,只要某个位置异常就整体回滚了。要是想上面那种回滚失败的,那spring使用场景是什么样的?
展开
 我来答
天空的疆域
2013-08-27
知道答主
回答量:6
采纳率:0%
帮助的人:3.5万
展开全部
你说的没有回滚是不是testTransaction(TestModel testModel)这个方法没有整体提交或回滚。
你现在的代码和spring的事务配置是不配套的。在spring配置中一个事务单元是一个方法。就是说updateData(long id)是一个事务管理,saveData(TestModel testModel)是被另一个事务管理的。在被testTransaction(TestModel testModel)这个方法时,他们的提交和回滚都是独立的,彼此没有事物关联。要是一个方法有多个DB数据更新操作,必须把所有DB操作写到一个方法里。
以你上边代码为例
public void testTransaction(TestModel testModel){
transactionDao.updateData(2);
testService.testSql();
transactionDao.saveData(testModel);
}
这样,transactionDao.updateData(2);执行后事务并没有对数据立即执行持久化操作,而是只改变了内存中持久化对象的数据,当下边的DB数据操作发生异常的时候,事务把内存中被改变的数据复原,并终止的处理,抛出异常。当这个方法全部被执行完毕的场合,如果没有异常发生,事务才会执行commit操作。
更多追问追答
追问
按照你说的应该如何测试呢?
是没有整理回滚。我理解的是testService.testSql();抛了异常应该前面的updateDate(2)应该要回滚到初始状态。但是实际上没有
追答
事务的测试,要结合查看DB数据,就是说看一个事务提没提交,要看它操作的数据对DB的数据改没改变。拿你的例子来说,测试时查看save和update方法的数据执行时,到没到DB里,到了就它的事务执行完了。
整体事务,在配置上,和单个事务是一样的。就是说spring的事务是以单个service方法为单位的。在这个service方法里,操作多少个表都是一个事务。跨service方法了,就是跨事务了。
你可能还会有疑问,都写到一个方法里,这个方法会很臃肿,不好维护,是的,如何处理呢?
一种方式使用排它处理。判断这次请求的第一个DB操作已经过时,就终止所有操作。
另一种方式,一次请求处理对应一个service方法,在这个方法里被调用的方法都不配置事务,而这个方法配置事务。
还拿你的例子来说,
public void testTransaction(TestModel testModel) throw Exception {
updateData(2);
transactionDao.saveData(testModel);
}
public void updateData(long id) throw Exception{
transactionDao.updateData(2);
testService.testSql();
}
save,update和testTransaction方法不变,配置事务,而updateData方法不配置事务。在spring方法配置事务时,使用特定名称配置。service方法起名时需要事务的起特定名称。
hh37555
2013-08-27 · 超过34用户采纳过TA的回答
知道答主
回答量:163
采纳率:100%
帮助的人:95.9万
展开全部
你这种配置方式的细节我没有深研过。但是回滚时是在你抛出runtimeexception的时候。默认hibernate在底层把所有sqlexception都包装成了runtimeexception了,所以如果底层报错时,比如拼出来的sql有问题,默认就会自动rollback了。
追问
这个地方抛的是NullPointException,是RuntimeException,所以这个地方是没问题的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
巩蕙兰uD
2013-08-27
知道答主
回答量:19
采纳率:0%
帮助的人:7.5万
展开全部
没回滚指是的错误之后数据照样插入到数据库?
事务
配置方法
配置切入点
更多追问追答
追问
没有回滚的意思是,数据库里面的数据应该不变的。

但是实际执行情况是。update成功,save失败
追答
保存的方法要是save开头,你update成功啦,说明 配置成功啦,从你图片上看,你的save方法前面有好像有空。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式