Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战


Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战

文章插图
一、前言在现代软件开发中 , 事务处理是必不可少的一部分 。当多个操作需要作为一个整体来执行时 , 事务可以确保数据的完整性和一致性 , 并避免出现异常和错误情况 。在SpringBoot框架中 , 我们可以使用声明式事务和编程式事务来管理事务处理 。其中事务的坑也是不少 , 比较常见的就是事务失效 , 大家可以看看!后面小编在出一篇事务失效场景哈 , 喜欢的可以关注 , 等待更新哈!
这篇博客将重点探讨这两种事务处理方式的源码实现、区别、优缺点、适用场景以及实战 。我们来接着说事务 , 里面还涉及到三个知识点 , 大家可以自行百度好好了解!
  • 事务的特性
  • 事务的传播行为
  • 隔离级别
本篇文章主要讲的就是实现事务的两种方式的分析!
让我们开始探索声明式事务和编程式事务吧!
文章很长 , 耐心看完希望对你有帮助!
本文源码是使用:springboot2.7.1 。
二、开启使用和大致源码实现1、开启使用我们在启动类上添加注解:@EnableTransactionManagement 。
后续使用就可以添加注解@Transactional(rollbackFor = Exception.class)使用 , 或者是使用编程式事务使用了 !
后面我们在详细演示怎么使用哈!
2、声明式事务源码 public class TransactionInterceptor extends TransactionAspectSupportimplements MethodInterceptor, Serializable{}TransactionInterceptor UML图:
Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战

文章插图
声明式事务主要是通过AOP实现 , 主要包括以下几个节点:
  1. 启动时扫描@Transactional注解:在启动时 , Spring Boot会扫描所有使用了@Transactional注解的方法 , 并将其封装成TransactionAnnotationParser对象 。
  2. AOP 来实现事务管理的核心类依然是 TransactionInterceptor 。TransactionInterceptor 是一个拦截器 , 用于拦截使用了 @Transactional 注解的方法
  3. 将TransactionInterceptor织入到目标方法中:在AOP编程中 , 使用AspectJ编写切面类 , 通过@Around注解将TransactionInterceptor织入到目标方法中 。
  4. 在目标方法执行前创建事务:在目标方法执行前 , TransactionInterceptor会调用PlatformTransactionManager创建一个新的事务 , 并将其纳入到当前线程的事务上下文中 。
  5. 执行目标方法:在目标方法执行时 , 如果发生异常 , 则将事务状态标记为ROLLBACK_ONLY;否则 , 将事务状态标记为COMMIT 。
  6. 提交或回滚事务:在目标方法执行完成后 , TransactionInterceptor会根据事务状态(COMMIT或ROLLBACK_ONLY)来决定是否提交或回滚事务 。
源码:
 @Override@Nullablepublic Object invoke(MethodInvocation invocation) throws Throwable {// Work out the target class: may be {@code null}.// The TransactionAttributeSource should be passed the target class// as well as the method, which may be from an interface.Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);// Adapt to TransactionAspectSupport's invokeWithinTransaction...return invokeWithinTransaction(invocation.getMethod(), targetClass, new CoroutinesInvocationCallback() {@Override@Nullablepublic Object proceedWithInvocation() throws Throwable {return invocation.proceed();}@Overridepublic Object getTarget() {return invocation.getThis();}@Overridepublic Object[] getArguments() {return invocation.getArguments();}});}下面是核心处理方法 , 把不太重要的代码忽略了 , 留下每一步的节点 。
 @Nullableprotected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass,final InvocationCallback invocation) throws Throwable {// 获取事务属性final TransactionManager tm = determ.NETransactionManager(txAttr);// 准备事务TransactionInfo txInfo = prepareTransactionInfo(ptm, txAttr, joinpointIdentification, status);// 执行目标方法Object retVal = invocation.proceedWithInvocation();// 回滚事务completeTransactionAfterThrowing(txInfo, ex);// 提交事务commitTransactionAfterReturning(txInfo);}


推荐阅读