2023年11月29日发(作者:)

@Transactional注解的rollbackFor属性

先回忆下java的异常模型,Throwable是最顶层的⽗类,有Error和Exception两个⼦类。

Error表⽰严重的错误(如OOM等);

Exception可以分为运⾏时异常(RuntimeException及其⼦类)和⾮运⾏时异常(Exception的⼦类中,除了RuntimeException及其⼦类之外

的类)。

⾮运⾏时异常是检查异常(checked exceptions),⼀定要try catch,因为这类异常是可预料的,编译阶段就检查的出来;

Error和运⾏时异常是⾮检查异常(unchecked exceptions),不需要try catch,因为这类异常是不可预料的,编辑阶段不会检查,

没必要检

查,也检查不出来

spring的@Transactional注解可以很⽅便的开启事务,但是,即Exception的⼦类

默认只在遇到运⾏时异常和Error时才会回滚,⾮运⾏时异常不回滚

中,除了RuntimeException及其⼦类,其他的类默认不回滚(不知道为什么要这样设计?)

⽽rollbackFor属性可以解决这个问题,

下⾯是关于@Transactional注解的⼀些实验

实验⼀

不加rollbackFor属性,抛出RuntimeException,正常回滚

@Transactional

@Transactional()

public void save(){

StudentDO studentDO = new StudentDO();

e("ltm");

(22);

(studentDO);

throw new OutOfMemoryError();