[Spring]事务回滚
2017-08-29 17:03
197 查看
最近在开发中遇到了一种很奇怪的现象,在一个service中开启事务并且做两次insert,当程序走到第二个insert时抛出Exception异常,service走完后,第一个insert插入到了数据库。
针对这个问题,查找了一些原因,发现Spring在做事务回滚时捕获的是RuntimeException运行时异常,而我的insert抛出的是Exception,所以导致事务失效。
以前的写法
现在的写法
Spring在操作事务时,必须抛出运行时异常,事务才有效。
后来,我又发现了第二种事务回滚的方法,个人认为这种方案比上面的灵活一些。
这种方案不用必须抛出运行时异常,Exception异常即可,重点是使用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
进行事务回滚。
@Transactional public void service (){ insert(); insert(); }
针对这个问题,查找了一些原因,发现Spring在做事务回滚时捕获的是RuntimeException运行时异常,而我的insert抛出的是Exception,所以导致事务失效。
以前的写法
public void insert(){ try { //... } catch (Exception e) { throw new Exception(e); } }
现在的写法
public void insert(){ try { //... } catch (RuntimeException e) { throw new RuntimeException(e); } }
Spring在操作事务时,必须抛出运行时异常,事务才有效。
后来,我又发现了第二种事务回滚的方法,个人认为这种方案比上面的灵活一些。
@Transactional public void service (){ try { //... } catch (Exception e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }
这种方案不用必须抛出运行时异常,Exception异常即可,重点是使用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
进行事务回滚。
相关文章推荐
- spring异常抛出触发事务回滚策略导读
- 基于Eclipse Maven的Spring4/Spring-MVC/Hibernate4整合之十:Spring mvc & hibernate 事务处理(回滚)
- try catch异常抛出与spring事务回滚策略相关
- 关于Spring事务回滚的配置及使用
- Spring事务异常回滚,捕获异常不抛出就不会回滚
- spring 声明式事务管理,回滚不起作用
- Spring-test事务自动回滚
- spring事务不回滚
- Spring事务管理只对出现运行期异常进行回滚
- Spring 事务回滚机制
- Spring事务管理只对出现运行期异常进行回滚
- Spring的事务管理对何种异常进行回滚
- spring事务默认运行时异常回滚,RuntimeException
- spring事务回滚的一些个人总结
- 关于Spring 代码中执行事务回滚
- Spring事务异常回滚失败原因,在事务处理层捕获异常不抛出就不会回滚
- java事务异常——Spring事务异常回滚,捕获异常不抛出就不会回滚
- spring事务手动回滚
- Spring事务回滚策略
- 关于spring 整合 hibernate 事务不回滚