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