目录
一.简单回顾Java Exception
该图摘自:https://blog.csdn.net/zhangerqing/article/details/8248186
异常可以分为运行时异常(RuntimeException)和非运行时异常(Exception中除RuntimeException及其子类以外的)。
异常还可以分为受控异常(checked exception)和不受控异常(unchecked exception)
受控异常(Checked Exception):就是非运行时异常,即Exception中除了RuntimeException及其子类以外的。受控异常这类异常必须写try{}catch{},或者throw抛出,否则编译通不过。
不受控异常(unchecked exceptions):RuntimeException和Error。这类异常不需要try{}catch{},也不需要throw抛出,编译能通过。为什么要使用非受控异常?为了简化代码。试想一下,如果所有可能出现异常的地方(比如访问数组元素可能会越界、调用对象方法,对象可能为null),我们都写try{}catch{},或者throw 抛出,那么代码肯定冗余的不成样子了。也就是说,采用非受控异常(运行时异常)可以减少代码的污染。
二.rollbackFor属性介绍
1.事务控制的3种方式
- 编程式事务:
- 声明式事务:
- 注解式事务:
2.事务不回滚的原因
- 默认情况下spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。
- Service方法中把异常try catch并且没有手动抛出RuntimeException
- Service方法中抛出的异常不为运行时异常(IO异常)
以注解为例:在类或方法前注解配置@Transactional(rollbackFor=Exception.class)就可以实现:
当发生受控异常(checked exceptions)时,事务也进行回滚。
原文出处:
https://www.cnblogs.com/zeng1994/p/8257763.html
https://blog.csdn.net/ljyhust/article/details/73431968?locationNum=5&fps=1