一、前言
在现代软件开发中,事务处理是必不可少的一部分。当多个操作需要作为一个整体来执行时,事务
可以确保数据的完整性和一致性
,并避免出现异常和错误情况。在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 Objec