前言

编写代码过程中,使用事务回滚很常见,但关于事务回滚有几个很基础的问题

事务

错误示范

1
2
3
4
5
6
7
@Transactional
public String checkDemo(String id) throws Exception{
if (id == null){
throw new Exception("ID不能为空");
}
return "success";
}

上述代码中,直接抛出了Exception异常,这种事务是无法控制住的,无法进行回滚。

进入@Transactional注解,其中有一个rollbackFor()回滚,官方文档中规定了只会对运行时异常错误进行回滚。

如果仅仅抛出一个Exception受检异常,是无法进行回滚的。

正确示范

想实现事务回滚,必须要符合官方文档中规定的方式

例如:在注解中声明一下回滚异常类型,或抛出RuntimeException异常

方式一:注解规定类型

代码中虽然使用了Exception异常,但是在注解中声明了方法中需要回滚的异常类型,所以下面的事务是可以回滚的

1
2
3
4
5
6
7
@Transactional(rollbackFor = Exception.class)
public String checkDemo(String id) throws Exception{
if (id == null){
throw new Exception("ID不能为空");
}
return "success";
}

方式二:运行时异常

使用运行时异常时,直接默认符合官方文档中规定的事务回滚要求了
方法上也可以不需要声明 throws RuntimeException继续向上抛异常了

1
2
3
4
5
6
7
@Transactional
public String checkDemo(String id) {
if (id == null){
throw new RuntimeException("ID不能为空");
}
return "success";
}

方式三:自定义异常

CustomException是自己定义的一个异常类,但自定义异常类一定要继承运行时异常类(extends RuntimeException

所以自定义异常的原理和【方式二:运行时异常】一样

1
2
3
4
5
6
7
@Transactional
public String checkDemo(String id) {
if (id == null){
throw new CustomException("ID不能为空");
}
return "success";
}

其他异常

JAVA中最常见的错误异常