返回
闹心!@Transactional注解无效,原因终于找到了!
后端
2024-02-17 12:33:53
当我们在开发SpringBoot项目的时候,我们最经常用到的注解就是@Transactional注解。毕竟谁都喜欢事物原子性带来的便捷。直到有一天我们发现,@Transactional注解失效了,而我却完全不知道原因是什么。
@Transactional注解失效,原因大致如下:
- 方法没有被Spring管理。 @Transactional注解只能作用于Spring管理的bean方法,如果方法没有被Spring管理,注解就不会生效。
- 没有事务管理器。 Spring需要一个事务管理器才能管理事务,如果项目中没有配置事务管理器,注解也不会生效。
- 方法抛出了不受检异常。 当方法抛出不受检异常时,事务会被自动回滚,注解也不会生效。
- 方法上配置了@Transactional(propagation=Propagation.NEVER)。 该配置表示方法在一个非事务环境中执行,即使方法所在的类或接口被@Transactional注解标注,注解也不会生效。
- 方法上配置了@Transactional(propagation=Propagation.NOT_SUPPORTED)。 该配置表示方法在一个非事务环境中执行,即使方法所在的类或接口被@Transactional注解标注,注解也不会生效。
- 方法上配置了@Transactional(propagation=Propagation.REQUIRED)。 该配置表示方法在一个事务环境中执行,如果当前存在事务,则方法加入到当前事务中,如果没有事务,则创建一个新的事务。如果方法所在的类或接口被@Transactional注解标注,并且方法上没有配置@Transactional注解,则方法默认使用该传播行为。
- 方法上配置了@Transactional(propagation=Propagation.REQUIRES_NEW)。 该配置表示方法在一个新的事务中执行,即使当前存在事务,也会创建一个新的事务。如果方法所在的类或接口被@Transactional注解标注,并且方法上没有配置@Transactional注解,则方法默认使用该传播行为。
- 方法上配置了@Transactional(propagation=Propagation.MANDATORY)。 该配置表示方法必须在一个事务环境中执行,如果没有事务,则抛出异常。如果方法所在的类或接口被@Transactional注解标注,并且方法上没有配置@Transactional注解,则方法默认使用该传播行为。
了解了以上这些原因,我们基本上可以确定@Transactional注解失效的原因。当发现失效时,我们可以先检查一下方法是否被Spring管理,是否配置了事务管理器,是否抛出了不受检异常,是否配置了@Transactional注解,以及注解的传播行为是什么。如果都检查了,还是不知道原因,可以尝试在方法上加一个try-catch块,并在catch块中打印异常信息,这样就可以知道是什么原因导致事务失效了。
希望这篇文章对您有所帮助!