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. 在应用配置文件 app.php 中找不到’route_check_cache’配置项2. 网页爬虫 - python 爬取网站 并解析非json内容3. java - mysql隔天自动删除数据4. spring - mysql中事务是互斥的么?5. linux - 为什么我在mysql的my.cnf下找不到bind-address?6. java连接mysql的线程安全问题7. mysql - 数据库中的引擎和表的引擎的区别在哪?8. javascript - js读取excel其中一列中的一个值是0.3556但是读出来是0.35559999999999997?9. 在别的电脑使用JDBC连接其他电脑上安装的mysql数据库10. web服务器 - ubuntu下布置apache加wsgi加python

网公网安备