本文介绍了SpringBoot框架中的声明式事务和编程式事务,并分析了它们的源码实现、区别、优缺点、适用场景以及实战。无论是采用哪种方式来管理事务,都需要考虑到业务需求和开发团队的实际情况,选择合适的事务处理方式,以确保系统的可靠性和稳定性。
一、前言
在现代软件开发中,事务处理是必不可少的一部分。当多个操作需要作为一个整体来执行时,事务可以确保数据的完整性和一致性,并避免出现异常和错误情况。在SpringBoot框架中,我们可以使用声明式事务和编程式事务来管理事务处理。其中事务的坑也是不少,比较常见的就是事务失效,大家可以看看!后面小编在出一篇事务失效场景哈,喜欢的可以关注,等待更新哈!
这篇博客将重点探讨这两种事务处理方式的源码实现、区别、优缺点、适用场景以及实战。我们来接着说事务,里面还涉及到三个知识点,大家可以自行百度好好了解!
- 事务的特性
- 事务的传播行为
- 隔离级别
本篇文章主要讲的就是实现事务的两种方式的分析!
让我们开始探索声明式事务和编程式事务吧!
文章很长,耐心看完希望对你有帮助!
本文源码是使用:springboot2.7.1。
二、开启使用和大致源码实现
1、开启使用
我们在启动类上添加注解:@EnableTransactionManagement。
后续使用就可以添加注解@Transactional(rollbackFor = Exception.class)使用,或者是使用编程式事务使用了 !
后面我们在详细演示怎么使用哈!
2、声明式事务源码
public class TransactionInterceptor extends TransactionAspectSupport
implements MethodInterceptor, Serializable{}
TransactionInterceptor UML图:
声明式事务主要是通过AOP实现,主要包括以下几个节点:
- 启动时扫描@Transactional注解:在启动时,Spring Boot会扫描所有使用了@Transactional注解的方法,并将其封装成TransactionAnnotationParser对象。
- AOP 来实现事务管理的核心类依然是 TransactionInterceptor。TransactionInterceptor 是一个拦截器,用于拦截使用了 @Transactional 注解的方法
- 将TransactionInterceptor织入到目标方法中:在AOP编程中,使用AspectJ编写切面类,通过@Around注解将TransactionInterceptor织入到目标方法中。
- 在目标方法执行前创建事务:在目标方法执行前,TransactionInterceptor会调用PlatformTransactionManager创建一个新的事务,并将其纳入到当前线程的事务上下文中。
- 执行目标方法:在目标方法执行时,如果发生异常,则将事务状态标记为ROLLBACK_ONLY;否则,将事务状态标记为COMMIT。
- 提交或回滚事务:在目标方法执行完成后,TransactionInterceptor会根据事务状态(COMMIT或ROLLBACK_ONLY)来决定是否提交或回滚事务。
源码:
@Override
@Nullable
public Object invoke(MethodInvoc