Spring 的声明式事务 (@Transactional) 是如何通过 AOP 实现的?

Spring AOP:声明式事务@Transactional在AOP中的实现 声明式事务使用 1.在pom.xml中引入依赖 这里使用了spring-jdbc,c3p0连接池,mysql驱动 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifac... 阅读详情

Spring 的声明式事务 (@Transactional) 是 AOP 技术最经典的应用之一。

其核心思想是:通过 AOP 代理,在业务代码执行前后,自动地开启、提交或回滚事务。

下面是详细的实现步骤和原理:


Step 1: 扫描与识别

当 Spring 容器启动时:

  1. 它会扫描所有的 Bean。
  2. 它会寻找被 @Transactional 注解标记的类或方法。
  3. 一旦发现某个 Bean(例如 OrderService)中含有 @Transactional 方法,Spring 就会判定这个 Bean 需要事务增强。

Step 2: 创建代理对象

对于需要事务增强的 Bean,Spring 不会直接将原始的 OrderService 实例放入容器。相反,它会:

  1. 使用 AOP 框架(具体来说是 TransactionProxyFactoryBean)为这个 OrderService 创建一个代理对象(OrderServiceProxy)。
  2. 这个代理对象看起来和原始对象一模一样(实现了相同的接口或继承了相同的类),但它的内部包含了额外的事务拦截器 (Transaction Interceptor)。
  3. 最终,当其他组件(如 Controller)通过 @Autowired 注入 OrderService 时,它们实际得到的是这个代理对象。

Step 3: 方法调用与拦截 (核心)

当你的代码调用一个被 @Transactional 注解的方法时(例如 orderServiceProxy.placeOrder()),这个调用过程会遵循一个典型的环绕通知 (@Around) 流程:

  1. 调用被代理对象拦截:
    你的调用首先到达的是 OrderServiceProxy,而不是原始的 OrderService。

  2. 事务拦截器 (Transaction Interceptor) 被激活:
    代理对象中的事务拦截器(可以看作一个环绕通知)开始工作。它的逻辑如下:

    a. 【方法执行前】准备事务环境:
    * 获取 PlatformTransactionManager(事务管理器,如 DataSourceTransactionManager)。
    * 检查当前是否存在一个已激活的事务。
    * 根据 @Transactional 注解中配置的传播行为 (Propagation) 来决定下一步操作。例如:
    * REQUIRED (默认):如果当前没事务,就开启一个新事务 (connection.setAutoCommit(false));如果已有事务,就加入它。
    * REQUIRES_NEW:挂起当前事务(如果存在),并总是开启一个全新的事务。
    * 根据注解配置设置事务的隔离级别 (Isolation)、超时时间 (Timeout)、只读状态 (Read-Only) 等。

    b. 【调用目标方法】执行核心业务逻辑:
    * 在 try 代码块中,事务拦截器会调用原始的 OrderService 对象的 placeOrder() 方法。
    * orderRepository.save(order);
    * stockService.decreaseStock(order.getProductId());
    * 你的所有业务代码都在这个事务的保护下执行。

    c. 【方法成功返回后】提交事务:
    * 如果目标方法成功执行完毕,没有抛出任何异常,try 块正常结束。
    * 事务拦截器会捕获到这个成功的状态,然后调用 transactionManager.commit() 来提交事务。

    d. 【方法抛出异常后】回滚事务:
    * 如果目标方法在执行过程中抛出了异常,这个异常会被 catch 块捕获。
    * 事务拦截器会检查这个异常的类型。根据 @Transactional 注解的回滚规则 (Rollback Rules):
    * 默认情况下,如果抛出的是 RuntimeException 或 Error,事务拦截器会调用 transactionManager.rollback() 来回滚事务。
    * 如果抛出的是已检查异常 (Checked Exception),默认不会回滚(这个行为可以配置)。
    * 回滚后,异常会继续向上层抛出,以便调用方可以感知到错误。

图解实现原理

+----------------+
| Controller     |
+----------------+
        | 1. 调用 orderService.placeOrder()
        v
+-----------------------------------------------------------------------------+
|              OrderService 代理对象 (Proxy)                                   |
|                                                                             |
|   +---------------------------------------------------------------------+   |
|   |             事务拦截器 (Transaction Interceptor - Around Advice)      |   |
|   |                                                                     |   |
|   |    2. 【方法执行前】                                                  |   |
|   |       - 获取事务管理器                                                |   |
|   |       - 根据传播行为,开启新事务 (connection.setAutoCommit(false))     |   |
|   |                                                                     |   |
|   |    3. 【调用目标方法】try {                                           |   |
|   |           target.placeOrder(); <---------------------------------+    |   |
|   |       }                                                          |    |   |
|   |                                                                  |    |   |
|   |    4a. 【成功返回后】catch (no exception) {                        |    |   |
|   |            transactionManager.commit(); // 提交事务              |    |   |
|   |        }                                                         |    |   |
|   |                                                                  |    |   |
|   |    4b. 【抛出异常后】catch (RuntimeException | Error) {             |    |   |
|   |            transactionManager.rollback(); // 回滚事务             |    |   |
|   |            throw ex; // 继续抛出异常                             |    |   |
|   |        }                                                         |    |   |
|   |                                                                     |   |
|   +---------------------------------------------------------------------+   |
|                                                                             |
+-----------------------------------------------------------------------------+
        ^                                                               |
        | 5. 最终结果或异常返回给 Controller                             |
        |                                                               |
        |        +--------------------------------------------------------+
        |        |
        v        v
+--------------------------+
|  OrderService 目标对象   |
|  (包含纯粹的业务逻辑)    |
+--------------------------+

总结

  • 核心技术:Spring AOP 的环绕通知 (@Around)。
  • 关键角色:
    • 代理对象 (Proxy):拦截方法调用。
    • 事务拦截器 (Transaction Interceptor):实现了具体的事务管理逻辑。
    • 事务管理器 (PlatformTransactionManager):执行真正的事务操作(开启、提交、回滚)。
  • 工作流程:
    1. 代理拦截:调用被代理对象拦截。
    2. 事务开启:在目标方法执行前,根据配置开启事务。
    3. 业务执行:调用原始目标对象的业务方法。
    4. 事务提交/回滚:根据业务方法的执行结果(成功或异常),决定是提交还是回滚事务。

通过这种方式,AOP 完美地将重复、通用的事务管理代码从核心业务逻辑中剥离出来,实现了高度的解耦和代码的整洁。

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据 VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据 日常工作,我们经常需要汇总相同格式的工作簿的某个工作表的数据 如1月业绩、2月业绩。。。。12月业绩等 姓名 数量 数据22 22 数据23 23 数据24 24 数据25 25 数据26 26 数据27 27 数据28 28 数据29 29 数据30 30 数据31 31 数据32 32 数据33 33 数据34 阅读详情

相关推荐

用SOLIDWORKS从零画一个履带机器人,手把手教你搞定底盘和传动

本文详细介绍了如何使用SOLIDWORKS从零开始设计履带式机器人,重点讲解底盘结构优化和传动系统设计的关键步骤。通过七个阶段的实战指南,包括前期规划、底盘建模、驱动系统装配、履带生成、动态模拟等,帮助工程师和爱好者掌握履带机器人的核心设计技巧,提升地形适应能力和动力效率。

weixin_30872499的博客 632

springboot项目事务配置 @Transactional注解及AOP实现全局事务管理

springboot项目事务配置 @Transactional注解及AOP实现全局事务管理 Hello啊,我是你们的杨洋啊,最近要新搭一个项目,正好写到了事务,那就跟大家聊聊实际工作中的事务的配置,那不说废话了,咱们正式开始,关于什么事事务之类的就不科普了 事务实现的方式: @Transactional注解实现 全局事务管理器 1.@Transactional注解实现 配置在类上: @Service("menuService") @Transactional(rollbackFor = Except

yanglei199307的博客 5828

ANSYS ICEM CFD 2023R2 结构化网格实战:翼型绕流 10 步生成高质量六面体网格

在计算流体力学(CFD)分析中,网格质量直接决定了仿真结果的精度和收敛性。对于翼型绕流这类典型的外部流动问题,结构化网格因其规则的节点排列和优异的边界层捕捉能力,成为高精度模拟的首选方案。通过在后缘处添加局部H型拓扑,并将过渡区增长率降至1.1,最终使网格质量指标提升40%,计算收敛速度提高2倍。这印证了结构化网格在复杂流动模拟中的不可替代性——虽然初期投入时间较多,但能显著提升计算精度和稳定性。在开始网格划分前,合理的几何准备是确保后续流程顺利的关键。对于翼型绕流,O型网格拓扑能提供最佳的边界层适应性。

weixin_30731305的博客 362

@Transactional 实现原理

Spring 框架通过 AOP 机制实现了声明式事务管理,核心是通过 @Transactional 注解控制事务的开启、提交和回滚。Spring 事务模块的核心组件包括 TransactionInterceptor、PlatformTransactionManager 和 TransactionAttributeSource 等。启用事务管理需使用 @EnableTransactionManagement 注解,Spring 会注册事务拦截器和事务属性源,并通过 AOP 代理机制生成代理对象。代理对象在方法

红血哥 992

告别偏色!手把手教你用i1Profiler 3.5为喷墨打印机制作专属ICC曲线(附D50/D65光源选择指南)

本文详细介绍了如何使用i1Profiler 3.5为喷墨打印机制作专属ICC曲线,解决设备偏色问题。从色彩管理基础、软件配置到色块打印与测量实战技巧,逐步指导用户完成曲线制作,并提供了D50/D65光源选择指南,确保色彩还原精准。适合摄影师和设计师提升打印质量。

weixin_30613343的博客 1万+

1、机器学习在环境科学中的应用与经典数据分析基础

本文介绍了机器学习在环境科学中的广泛应用,包括卫星遥感、气候预测、空气质量预报等领域,并系统回顾了经典数据分析的基本概念,如期望、方差、协方差和相关性及其显著性检验。同时,文章阐述了贝叶斯定理、判别函数与分类、聚类分析等方法的原理与应用,强调了经典统计方法与机器学习技术的互补关系。最后展望了未来环境科学中数据分析的发展方向,强调多学科融合与方法创新的重要性。

stone的博客 144

@Transactional原理分析

Spring事务管理的核心原理是基于动态代理和AOP拦截实现的。当使用@Transactional注解时,Spring会在Bean初始化阶段创建代理对象(JDK或CGLIB),并在方法调用时通过TransactionInterceptor进行事务控制。事务管理器控制事务的开启、提交/回滚,并通过ThreadLocal实现资源同步。常见失效场景包括:私有方法调用、自调用、异常处理不当等。该机制通过AOP实现,对业务代码低侵入,使开发者能专注业务逻辑开发。

cxbtdd的博客 816

【异常】OpenClaw认证 Please carry the API secret key in the ‘Authorization‘ field of the request header

OpenClaw助手Agent因401认证异常导致业务中断的排查方案。该异常由大模型API鉴权全量失败触发,主要根因包括API凭证配置错误、密钥过期、账号权限不足或请求格式不规范。解决方案分四级:优先校验并修正API密钥;排查账号状态与调用权限;检查请求格式规范;最后排查网络或服务商问题。建议建立密钥生命周期管理机制,定期监控额度,使用专用API密钥以规避类似问题。该异常属于凭证配置类故障,不影响系统稳定性。

奶爸的编程之路,也就一周冷个三天 465

Spring 如何使用 AOP 实现声明式事务管理?

元数据,告诉 AOP 在哪里以及如何应用事务。它本身不包含任何逻辑。AOP 代理 (Proxy):由 Spring 动态创建的“管家”对象,是事务逻辑的实际入口。它包装了原始的业务对象。事务拦截器 (:AOP 通知(Advice)的具体实现,是代理对象中的核心逻辑。它负责在目标方法调用前后开启、提交或回滚事务。事务管理器 (:一个统一的事务管理接口。Spring 通过它来适配不同的数据源技术(如 JDBC, JPA/Hibernate, JTA)。它负责执行真正的事务操作(begincommit。

专注于技术分享 898

GRCNN抓取网络学习3【自制Jacquard数据集模型调优】

请先完成,这样有利于下面操作的理解!然后第二步是,有了自己的数据集输入到GRCNN中是三种文件,那么可以GRCNN抓取网络学习2【自制Jacquard数据集训练】!既然学会训练,那么开展下一步计划模型调优。GRCNN源码:https://github.com/skumra/robotic-grasping。

vor234的博客 2502

华南理工大学-大学物理实验-绪论作业

3.用公式测量某圆柱体铝的密度,测得直径=2.0420.003(cm),高=4.1260.004(cm),质量=36.4880.006(g)。计算铝的密度和测量的标准差,并以测量结果表达式表示之。(要求判别和剔除异常数据)(30分)(了解图解法的注意事项,大学物理实验众多实验数据处理采用这种方法,如PN结温度特性研究,光电效应与普朗克常数的测定,霍尔效应测磁场等等,注意规范作图)实验测得温度与对应的金属丝的长度的数据如下表所示。(了解异常数据的判断方法及具体判断过程,30分的题目n(*≧▽≦*)n)

mohen_777的博客 581

一文玩转@Transactional SpringAOP声明式事务

Isolation` 是一个枚举类型,包含了不同的隔离级别选项,例如 `READ_UNCOMMITTED`、`READ_COMMITTED`、`REPEATABLE_READ` 和 `SERIALIZABLE` 等。在使用 `@Transactional` 注解时,你需要在Spring的配置文件中配置事务管理器,以便让Spring知道如何管理事务。总的来说,`@Transactional` 注解是Spring框架中用于声明式事务管理的重要工具,它使得在Spring应用中使用事务变得简单和便捷。

m0_66572126的博客 884

[EdgeAI] NXP eIQ 机器学习Toolkit (二):模型篇

eIQ™机器学习(ML)软件开发环境支持在恩智浦EdgeVerse™微控制器和微处理器(包括i.MX RT跨界MCU和i.MX系列应用处理器)上使用ML算法。eIQ ML软件包括称为eIQ Toolkit的ML工作流工具以及推理引擎、神经网络编译器和优化库。......

HowieXue 薛永浩的博客 1万+

@transactional注解原理_Spring 的事务实现原理和传播机制

本节思维导图事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式两种。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体的逻辑与事务处理解耦。生命式事务管理使业务代码逻辑不受污染,因此实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(XML)中做相关的事务规则声明,另一种是基于 @T...

weixin_39845113的博客 5233

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring事务实现的方式及底层原理

spring事务的实现方式 spring框架提供了两种事务实现方式:编程式事务、声明式事务 编程式事务:在代码中进行事务控制。优点:精度高。缺点:代码耦合度高 声明式事务:通过@Transactional注解实现事务控制 spring事务的底层原理 事务的操作本来应该由数据库进行控制,但是为了方便用户进行业务逻辑的控制,spring对事务功能进行了扩展实现。一般我们很少使用编程式事务,更多的是使用@Transactional注解实现。当使用了@Transactional注解后事务的自动功能就会关闭,由sp.

qq_34886456的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

spring事务/和aop的执行过程

1、开启事务的方式 (1) 通过代码的方式创建事务,我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。 (2) 基于@Transactional的声明式事务管理 (3) 基于aspectj Aop 配置事务管理 (4) 基于 TransactionProxyFactoryBean的声明式事务 (1)通过代码的方式创建事务 @Autowired private DataSourceTransactionManage

mycsdnhmk的博客 329

Spring声明式事务控制原理之声明式事务的重要组件(注解实现)以及之间关系

实现声明式事务只需要两个注解即可完成:@EnableTransactionManagement和@Transactional。下面就探究一下这两个注解究竟做了什么。 @Transactional注解大家比较熟悉,作用在方法上用来显式声明事务,可以通过属性指定事务的隔离级别,传播行为,什么异常回滚什么异常不回滚等。 主要还是探究一下@EnableTransactionManagement注解 进入EnableTransactionManagement注解类发现首先这个类通过@Import帮Spring以注解解

yangxiaofei_java的博客 786

【重写SpringFramework】声明式事务上:构建事务切面(chapter 4-5)

上一节介绍了编程式事务,我们发现,事务操作有两个特点。一是事务操作广泛地出现在应用程序中,二是事务操作的逻辑是有迹可循的,无非是对开启事务、回滚和提交这几个操作的组合使用。换句话说,事务操作是一种公共行为,可以从众多的业务代码中剥离出来,这是很典型的面向切面编程。因此,Spring 依托已有的 AOP 功能,提供了一套使用注解进行事务管理的解决方案,即声明式事务。声明式事务可以看做是面向切面编程的一个用例,在实际开发中得到了广泛地使用。

2401_89221445的博客 1049

Spring的@Transactional如何实现的

Spring的@Transactional如何实现的

吴名氏的博客 15万+

Spring中@Transactional是怎么引入事务AOP的

Spring的@Transactional注解实际上定义了一个切面,该切面包含了启动、提交和回滚事务的通知。:@Transactional注解可以配置多种事务属性,如传播行为(propagation)、隔离级别(isolation)、超时时间(timeout)、只读性(read-only)和回滚规则(rollbackFor、noRollbackFor)。这些属性决定了事务的具体行为。通常,一个事务开始于第一个被@Transactional注解的方法的调用,并结束于该方法返回时(除非发生异常并触发回滚)。

怀揣梦想,一颗执着于技术的心从未磨灭,内心住着一颗顽强的小强时刻提醒自己层层突破自我,同时也成就他人 349

springboot或spring中使用编程式事务和声明式事务

spring中使用事务有两种方式,一种是编程式,一种是声明式。 编程式事务 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。类似下面的代码,注入transactionTemplate后,执行execute方法,方法参数是一个TransactionCallback的匿名实现,TransactionCallbackWithoutResult是一个抽象

不二的博客 1040

Spring及Spring boot Spring声明式事务管理 总结文

Spring声明式事务因为综合了四个方面知识点,所以会显的复杂,其实梳理一下,总结一下也比较简单。 事务 注解@Transactional AOP 自动配置 这是普遍技术优化所呈现的特点:通过封装非业务代码来达到方便的同时结合了更多的技术导致与底层越来越远,源码阅读越来越困难,要掌握的知识也更多。 总的来说,其实还好,毕竟业务是频繁无限的,而源码总是有限的,如果这样优化带来的收益值得我们去增加源码的复杂度,那就应该去优化。 如果想要分析清楚Spring声明式事务,就先应该把自动配置源码的分析先放下,

qq_44587855的博客 1044

Spring 声明式事务管理 以及 事务中的异常捕获

Spring 的声明式事务管理是通过AOP 技术实现的事务管理,其本质是对目标方法进行前后拦截,然后在目标方法执行之前创建或者加入一个事务,在目标方法执行完成后根据目标方法的执行情况进行事务提交或者回滚。 声明式事务的最大优点是不需要通过编程式对事务进行管理,即不需要在业务代码中掺和大量事务处理的代码,保证了代码的简洁性,便于后期的维护。 Spring 的声明式事务管理有两种方式 :基于 XML的...

qq_41193133的博客 1044

Spring声明式事务管理

Spring声明式事务管理 Spring的声明式事务管理是通过AOP技术实现的事务管理,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行目标方法之后根据执行情况提交或者回滚事务。 声明式事务管理的最大优点是不需要通过编程的方式管理事务,因而不需要在业务逻辑代码中掺杂事务处理代码,只需要相关的事务规则声明便可以将事务规则应用到业务逻辑中,在通常情况下,在开发中使用声明式事务管理不仅因为简单,更主要因为纯业务代码不会被污染,极大地方便代码的后期维护。 Spring声明式事务管理可以

nuist_NJUPT的博客 1876

【spring】声明式事务的使用与其实现原理

传统JDBC事务的使用 package com.morris.spring.demo.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * 传统JDBC事务的使用 */ public class TraditionTransactionDemo { public static void main(S

morris 715

Spring注解驱动:AOP与事务(二)

文章目录1.AOP1.1 总结介绍1.2 举例2.声明式事务2.1 总结介绍2.2 举例 1.AOP 1.1 总结介绍 /** * AOP:【动态代理】 * 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式; * * 1、导入aop模块;Spring AOP:(spring-aspects) * 2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx) * 3、定义一个日志切面类(Lo

有点想法的专栏 294

spring源码阅读--@Transactional实现原理

@Transactional注解简介 @Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚。@Transactional注解可以帮助我们把事务开启、提交或者回滚的操作,通过aop的方式进行管理。通过@Transactional注解就能让spring为我们管理事务,免去了重复的事务管理逻辑,减少对业务代码的侵入,使我们开发人员能够专注于业务层面开发...

嘎嘎的博客 6万+
上一篇: MQTT 的核心组件是什么?
下一篇: 数据应该如何组织,才能让Excel“读懂”?
冰糖心书房
博客等级 码龄15年 6016粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值