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

news2024/11/17 21:48:34

在 Spring 中,@Transactional 注解是管理事务的关键工具之一。它允许开发人员通过简单地在方法或类上添加注解来定义事务的边界,从而实现对数据库操作的事务管理。

@Transactional 是基于 Spring AOP(Aspect-Oriented Programming,面向切面编程)实现的,通过代理模式和动态代理技术来实现事务的添加、管理和控制。

1. Spring AOP 概述

Spring AOP 是 Spring 框架的一个关键组成部分,它通过在方法执行过程中动态地添加额外的功能,实现了横切关注点的模块化。在 Spring AOP 中,横切关注点(cross-cutting concerns)是指那些在应用程序中散布在不同模块中的功能,例如日志记录、事务管理、安全性等。而切面(Aspect)则是将这些横切关注点模块化的实现方式。

Spring AOP 使用代理模式来实现横切关注点的添加。在 Spring 中,当一个 bean 被代理时,Spring 容器会动态地创建一个代理对象,并将切面逻辑织入到目标对象的方法执行中。这样,当目标对象的方法被调用时,切面逻辑会在方法执行前、执行后或出现异常时执行,从而实现对横切关注点的控制。

2. @Transactional 的实现原理

@Transactional 注解是 Spring 提供的一种声明式事务管理的方式。当开发人员在方法或类上添加 @Transactional 注解时,Spring 会在运行时通过 AOP 动态地为这些方法添加事务管理逻辑。下面是 @Transactional 注解的简单使用示例:

@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
    }
}

在上述示例中,createUser 方法上添加了 @Transactional 注解,表示这个方法应该在一个事务中执行。当调用 createUser 方法时,Spring 会动态地为该方法添加事务管理逻辑,确保在方法执行过程中的数据库操作在事务的管理下进行。

3. @Transactional 的工作原理

Spring 中 @Transactional 注解的工作原理可以概括为以下几个步骤:

步骤 1:扫描和解析 @Transactional 注解

在 Spring 应用程序启动时,Spring 容器会扫描并解析带有 @Transactional 注解的类和方法。这些类和方法会被标记为需要添加事务管理的对象。

步骤 2:生成事务增强器(TransactionInterceptor)

在解析完带有 @Transactional 注解的类和方法后,Spring 会生成一个事务增强器(TransactionInterceptor),用于实际的事务管理。事务增强器是一个 AOP 切面,它包含了事务管理的核心逻辑。

步骤 3:为目标对象生成代理

在 Spring 中,通常情况下使用 JDK 动态代理或 CGLIB(Code Generation Library)来生成代理对象。对于带有 @Transactional 注解的类和方法,Spring 会为它们生成代理对象,并将事务增强器织入到代理对象的方法执行中。

步骤 4:事务管理

当调用带有 @Transactional 注解的方法时,实际上是调用了代理对象的方法。在代理对象的方法执行中,事务增强器会在方法执行前开启事务,在方法执行后提交事务,或在出现异常时回滚事务。这样,就实现了对方法执行过程中数据库操作的事务管理。

4. 事务传播行为

除了 @Transactional 注解之外,Spring 还提供了事务传播行为(Transaction Propagation Behavior)的设置。事务传播行为定义了在方法调用链中不同方法之间事务的传播方式。例如,当一个事务方法调用另一个事务方法时,应该如何处理事务。

Spring 中常用的事务传播行为包括:

  • REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则新建一个事务。
  • REQUIRES_NEW:始终新建一个事务,如果当前存在事务,则将当前事务挂起。
  • NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则执行类似于 REQUIRED 的操作。

开发人员可以通过 @Transactional 注解的 propagation 属性来指定事务传播行为,从而控制方法调用链中事务的传播方式。

通过 @Transactional 注解,Spring 提供了一种简单而强大的声明式事务管理方式。通过 AOP 技术,Spring 在运行时动态地为带有 @Transactional 注解的方法添加事务管理逻辑,实现了对数据库操作的事务管理。

了解 @Transactional 注解的工作原理和事务传播行为,有助于开发人员更好地理解 Spring 中的事务管理机制,并能够更灵活地配置和管理事务。

黑马程序员免费预约咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1655943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小笔记】问答系统可视化实现的三种方式

下面三种方式都是基于Python的哈,从简单到复杂。 方式一:命令行交互问答 优点:原始简单直接 方式二:使用Python可视化框架 优点:无需学习前端技术栈即可搭建一个web。 streamlit:⭐️⭐️⭐️⭐️gra…

炒美股怎么开户?

近年来,随着国内投资者对境外投资需求的不断增长,炒美股逐渐成为许多投资者的选择。然而,随着监管政策的不断完善,传统的互联网券商开户方式已经不再适用。那么,对于想要入场美股市场的投资者来说,该如何开…

太牛逼了,用ComfyUI中一键完成电商模特换装换背景!商业级教程附上!

🌐 大背景:电商时代的画卷正在翻页 在全球电子商务风起云涌的今天,市场竞争愈发激烈。商家们始终在寻求提高效率、减少成本和增强用户体验的新方法。然而,一个关键问题一直困扰着电商行业——**如何高效且经济地展示商品&#xff…

Vue 项目 尚品汇(二)(暂停进行)

一、Home 模块组件拆分 基本流程 先写静态页面 拆分静态组件 获取服务器的数据进行展示 动态业务 (一)三级联动组件 如果一个组件在很多模块之间都在使用,我们就拆分成成一个全局组件 只需注册一次 在全局的项目都能使用 三级联动在 …

深入理解Go语言并发编程

随着计算机硬件的发展,多核处理器已经成为现代计算机的主流配置。在这样的背景下,并发编程成为了一种必备的技能。Go 语言作为一门先进的编程语言,天生支持并发编程,提供了丰富的并发原语和工具,使得并发编程变得更加容…

[YOLOv8] 用YOLOv8实现指针式圆形仪表智能读数(一)

最近研究了一个项目,利用python代码实现指针式圆形仪表的自动读数,并将读数结果进行输出,若需要完整数据集和源代码可以私信。 目录 🍓🍓1.yolov8实现圆盘形仪表智能读数 🙋🙋2.仪表目标检测…

机器人系统可以支持对接人工系统吗?

​ 随着科技的飞速发展,机器人系统在各行各业都扮演着越来越重要的角色。它们可以高效地处理大量数据,执行繁琐的任务,甚至在某些领域超越了人类的能力。然而,机器人系统也有其局限性,特别是在处理复杂的人际交往…

linux 服务器无 sudo 权限非 root 用户安装特定版本 cuda

1. 下载 cuda toolkit 下载想要版本的 cuda toolkit CUDA Toolkit 11.8 Downloads | NVIDIA Developer [xxxlocalhost ~]$ hostnamectlStatic hostname: localhost.localdomainIcon name: computer-serverChassis: serverMachine ID: b4258bf9bef54798b03e8e3a13756124Boot …

如何做到销售订单不做可用量检查,而交货单做

如何保证一个用户做某物料可用量检查时,不会锁定物料 可用量和需求冻结标志 Indicates whether, during the availability check, the material is blocked for other users. The block remains until the transaction responsible has been saved. It is set at m…

Web3与跨境支付:探讨区块链如何改变国际交易

随着区块链技术的发展和普及,人们开始意识到其在跨境支付领域的巨大潜力。在传统的跨境支付系统中,存在着诸多问题,如高昂的手续费、长时间的处理周期以及缺乏透明度等。而区块链作为一种去中心化、安全、透明且可追溯的技术,被认…

一步成像:Hyper-SD在图像合成中的创新与应用

一、摘要: 论文:https://arxiv.org/pdf/2404.13686 代码:https://huggingface.co/ByteDance/Hyper-SD 在生成人工智能领域,扩散模型(Diffusion Models, DMs)因其出色的图像生成质量而备受关注,但…

Oracle里令人头疼的生僻字处理案例

事情起因 有小伙伴找到我问一下生僻字的问题,数据库是oracle 11g,字符集是zhs16gbk 下图里显示的??应该是“𧿹”这个字,算是个生僻字。 问应用厂家就说数据库字符集建错了,要改库的字符集。…

LeetCode89:柠檬水找零

题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零&a…

docker容器技术篇:rancher管理平台部署kubernetes集群

rancher管理平台部署kubernetes集群 Rancher 是一个 Kubernetes 管理工具,让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,创建节点并安装 Kubernetes,或者导入在任何地方运行的现…

引领AI数据标注新纪元:景联文科技为智能未来筑基

在人工智能蓬勃发展的今天,数据如同燃料,驱动着每一次技术飞跃。在这场智能革命的浪潮中,景联文科技凭借其深厚的专业实力与前瞻性的战略眼光,正站在行业前沿,为全球的人工智能企业提供坚实的数据支撑。 全国布局&…

C++向函数传递对象

C语言中,对象作为函数的参数和返回值的传递方式有 3 种:值传递、指针传递和引用传递。 1. 对象作为函数参数 把实参对象的值复制给形参对象,这种传递是单向的,只从实参到形参。因此,函数对形参值做的改变不会影响到实…

Qt 6.7功能介绍

Qt 6.7为我们所有喜欢在构建现代应用程序和用户体验时获得乐趣的人提供了许多大大小小的改进。一些新增内容作为技术预览发布,接下来我们就一起来看看吧: 将C20与Qt一起使用 对于许多编译器工具链来说,C20仍然是可选的和实验性的,…

tartiflette,一个有趣的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - tartiflette。 Github地址:https://github.com/tartiflette/tartiflette Tartiflette是一个为Python编写的GraphQL服务器实现,它建立在现代异步编程…

机器学习中线性回归算法的推导过程

线性回归是机器学习中监督学习中最基础也是最常用的一种算法。 背景:当我们拿到一堆数据。这堆数据里有参数,有标签。我们将这些数据在坐标系中标出。我们会考虑这些数据是否具有线性关系。简单来说 我们是否可以使用一条线或者一个平面去拟合这些数据的…

Android Compose 二:布局的对齐方式

布局的对齐方式 使用Modifier 内容或者子组件居中 Text(text "Hello $name!",modifier Modifier.fillMaxSize() //设置宽高撑满.wrapContentHeight(align Alignment.CenterVertically) //设置竖直居中.wrapContentWidth(align Alignment.CenterHorizontally…