spring声明式事务@Transaction的避坑指南(一)

在spring框架下开启事务, 直接在类或者方法上加伤Transaction注解, 简单粗暴. 但是实际上却有很多坑需要注意.

一号坑:

Transaction并不是在捕捉到任何异常时都会执行回滚.

@Transaction注解的默认捕捉异常是RunTimeException

我们首先需要知道, 异常分为两类: 运行时异常和非运行时异常:

1. 运行时异常包括: RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等.
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理, 当出现这样的异常时,总是由虚拟机接管。
2.非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。
对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。

 

也就是说, 在默认情况下, @Transaction是不会处理非运行时异常的.

如果需要在出现 非运行时异常 时 也让事务进行回滚, 有以下两种方法:

1. 设置@Transaction的rollbackFor为指定的异常, 如果需要保函所以异常, 可以指定为Excetion:

    @Transactional(rollbackFor=Exception.class)

2. 由于非运行时异常. 必须由用户进行抛出或者捕捉, 可以在try/catch中手动抛出一个异常(RuntimeException类或子类异常), 比如一些自定义的继承RuntimeException的异常

3. 遵循阿里规约: 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。

 

你可能感兴趣的:(java)