Spring @Transactional注解的使用注意事项

Spring @Transactional注解的使用注意事项

1.1、只能用在public方法

@Transactional注解只能用在public方法上,如果用在protected或private方法上,不会报错,但也不会回滚。

1.2、只能回滚非受检异常

Java异常分类如下:

-Throwable

--|Error

--|Exception

-----|IOException

-----|ClassNotFoundException

-----|CloneNotSupportedException

-----|RuntimeException

其中,Error和RuntimeException的子类是受检异常,当出现这些异常时@Transactional会进行回滚。但如果发生的是非受检异常,不会回滚。

1.3、指定回滚异常类型

如果需要在发生回滚非受检异常时进行回滚,可以指定回滚的异常类型,如下:

@Transactional(rollbackFor = Exception.class)

1.4、只能作用于被Spring管理的类上

@Transactional一般用在Service层,一般我们都会加上@Service注解,所以一般不会遇到这个问题。

1.5、被try...catch...处理的异常不会回滚

这其实是废话,因为try...catch处理了,就不会发生异常。

1.6、手动指定传播机制

Spring的事务有七种传播机制,如下:

PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,则创建一个事务,这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务来执行
PROPAGATION_MANDATORY 支持当前事务,如果没有当前事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务执行操作,如果当前存在事务,则当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED 类似的操作。

可以在@Transactional注解中手动指定:

 @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)

参考:https://blog.csdn.net/qq_33036061/article/details/106801466

posted @ 2022-04-28 16:22  张瑞丰  阅读(348)  评论(0编辑  收藏  举报