Spring 事务再梳理之 在 SpringBoot 上的小知识
- SpringBoot 一般会自动开启事务管理器
在 SpringBootApplication 的主类上添加注解 @EnableTransactionManagement
开启事务管理;
@SpringBootApplication
@EnableTransactionManagement
public class SpringBootTestTransactionApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootTestTransactionApplication.class, args);
}
}
但其实,不配置也木有关系,因为 SpringBoot 框架已经帮开发者配置好了(符合某些条件的情况下启用);
在 org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
类中有下面的代码 ;
@Configuration
@ConditionalOnBean(PlatformTransactionManager.class)
@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
public static class EnableTransactionManagementConfiguration {
@Configuration
@EnableTransactionManagement(proxyTargetClass = false)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = false)
public static class JdkDynamicAutoProxyConfiguration {
}
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true)
public static class CglibAutoProxyConfiguration {
}
}
在 PlatformTransactionManager 存在的情况下,且 AbstractTransactionManagementConfiguration 不存在的情况下启用,一般条件下,这些条件都会满足;
@Transactional
使用在 public 方法上
@Transactional 注解只能应用到 public 方法上。 如果应用在 protected、private等方法上,不会报错,不过事务不起作用;
- 默认情况,非 RuntimeException 异常不会回滚
默认情况下,Transactional 注解的事物所管理的方法中,如果方法抛出运行时异常
或Error及子类
,那么会进行事务回滚;如果方法抛出的是非运行时异常
(包含受检异常),那么不会回滚。
检查异常
属于非运行时异常,不会作出回滚处理;
- 注意异常的错误捕获操作
注意:如果直接 catch Exception 异常,然后再抛出 Exception 异常,这时就可能把 RuntimeException 变成了 Exception;
但是 Exception 异常不属于运行时异常
,默认在遇到运行时异常时事务才进行回滚,那么这种情况下事务是不会回滚的。
我们可以在 @Transacional 注解中通过设置 rollbackFor = {Exception.class} 来解决这个问题。即:设置当Exception异常或Exception的所有任意子类异常时事物会进行回滚。
即被 catch 处理了的异常,不会被事务作为判断依据;如果异常被 catch 了,但是又在 catch 中抛出了新的异常,那么事务会以这个新的异常作为是否进行回滚的判断依据。
- 同一个事务里面,对
某一条数据
的增删改、 都会影响到这个事务里面接下来的对这个条数的增删改查;
资料来源:https://blog.csdn.net/justry_deng/article/details/80828180