学习java,事务一般都是项目中不可或缺的,只是有些时候用的较少,所以接触也比较少,但对于这个东西必须要记录一下,不管是面试还是工作中,一定会遇到。
两种事务管理方式:
- 编码式事务管理:将事务控制代码编写在业务代码之中。
- 声明式事务管理:基于AOP(面向切面编程),事务管理与业务逻辑解耦。声明式事务管理的两种实现:
- 在配置文件(xml)中配置。
- 基于@Transactional注解。
在Springboot项目中,一般用@Transactional注解
1.开启事务注解
在项目主类上,加上注解@EnableTransactionManagement开启事务注解(ps:一般无需配置)
@EnableTransactionManagement
public class ICApiApplication {
public static void main(String[] args) {
SpringApplication.run(ICApiApplication.class, args);
}
}
2.在目标类、方法上添加注解@Transactional
2.1 如果注解在目标类上,则表示此类所有方法都开启事务
2.2 如果注解在目标方法上,则表示只有此方法开启事务
2.3 如果一个方法上存在@Transactional,且其所属类上同样存在@Transactional,则以方法级别的事务配置为准。
3.是否发生了自调用问题
3.1 只有当事务方法被当前类以外的代码调用时,才会才由 Spring 生成的代理对象来管理。
3.2 自调用问题:当事务方法被本类内部方法调用时,@Transactional并不生效。
3.2.1 同一个类中,非事务方法调用事务方法,当事务方法发生异常时,事务控制无效,不会回滚
3.2.2 同一个类中,事务方法调用非事务方法,当发生异常时,事务控制有效,因为事务方法被外部代码调用;即使非事务方法又调用事务方法,事务依然有效,此时事务已经开启管理
4.对所有异常都回滚
@Transactional(rollbackFor = Exception.class)
参考来源:https://blog.csdn.net/hanchao5272/article/details/90343882