java - Spring事务回滚问题
问题描述
Spring事物,在service层注入事物,进行两个insert操作,在service方法中要自己抛出异常然后指定回滚吗?还是一个insert没有成功自己也不用抛出异常就会回滚吗?这里使用mybatis的代理dao实现,insert失败时会有提示或异常抛出吗
问题解答
回答1:使用@Transaction(rollbackFor=Throwable.class)注解到Service类上或具体的方法上,需要注意的是@Transaction注解默认只对RuntimeException异常捕获并回滚,也就是说如果你抛出的是Exception异常将不进行回滚,所以要记得加上rollbackFor=Throwable.class指定所有的异常都进行回滚
回答2:同意@正能量前线的答案,并且补充下,如果在一个方法中进行多次操作,需要考虑事务的传播范围,当然默认是 propagation = Propagation.REQUIRED,意思是说: 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.
回答3:如果有编译异常抛出就可以 不可以自己捕获处理 你既然用了spring框架 ,自己捕获并处理了异常,框架不会帮你回滚了,前提是你在spring配置文件里边配置了事务的回滚策略同意一楼所说默认运行异常回滚,事务是加在service层的,你那两个insert方法本身并没有事务,所以不需要考虑传播行为。
回答4:看了前面前面两位的回答,我再补充下。在Spring事务默认是基于接口的JDK代理。所以在你的Service层调用的两个insert方法,如果insert也是service层方法,那必须是接口方法,如果是私有方法,则私有方法不会回滚。还要注意多线程情况下的事务问题。
相关文章:
1. angular.js使用$resource服务把数据存入mongodb的问题。2. 更新mysql中被别人锁定的行, 能不能快速失败直接报错, 而不是一直等待3. python小白 想做一个能够计算圆周率的代码,不知道怎么写4. mysql删除一个空数据库报错Table storage engine for ’proc’ doe5. javascript - h5 video层级太高导致浮在div上面,如何解决?6. mysql - 数据库建表方面的问题?7. javascript - Ajax加载Json时,移动端页面向左上角缩小一截儿,加载完成后才正常显示,这该如何解决?8. python运行后没有任何反馈要怎么排查9. javascript - 如何获取未来元素的父元素在页面中所有相同元素中是第几个?10. javascript - 我的站点貌似被别人克隆了, google 搜索特定文章,除了域名不一样,其他的都一样,如何解决?
