Spring声明式事务(@Transactional)原理之-ProxyTransactionManagementConfiguration

在现代的企业级应用开发中,事务管理是一个至关重要的领域。Spring框架通过提供声明式事务管理的方式,极大地简化了事务管理的实现。

其中,@Transactional注解是最常用的声明式事务管理的方式之一。

然而,@Transactional注解的背后隐藏着一系列复杂的实现原理。本文将深入探讨Spring声明式事务的实现原理之一——ProxyTransactionManagementConfiguration。

什么是声明式事务管理

在传统的编程模型中,我们需要在代码中显式地编写事务管理逻辑,包括事务的开始、提交、回滚等。

而在声明式事务管理模型中,我们可以通过注解或者XML配置的方式,将事务管理逻辑与业务逻辑分离开来,使得我们只需要专注于业务逻辑的实现,而不需要关心事务管理的细节。

@Transactional注解就是用来实现声明式事务管理的重要工具之一。

@Transactional注解的使用方法

@Transactional注解可以用来修饰类或者方法,用来声明某个方法需要进行事务管理。我们可以通过设置不同的属性来指定事务的传播行为、隔离级别、超时时间等。

示例如下:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

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

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

在上面的示例中,createUser方法和getUserById方法都使用了@Transactional注解,表示它们需要进行事务管理。

ProxyTransactionManagementConfiguration的作用

ProxyTransactionManagementConfiguration是Spring框架中负责声明式事务管理的核心配置类之一。它负责配置和初始化事务相关的组件,为使用@Transactional注解的方法生成代理对象,并将事务管理逻辑织入到目标方法中。

ProxyTransactionManagementConfiguration的源码分析

1. 开启@EnableTransactionManagement注解

ProxyTransactionManagementConfiguration类上标注了@EnableTransactionManagement注解,表示启用了声明式事务管理。

@Configuration
@EnableTransactionManagement(mode = AdviceMode.PROXY)
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
    //...
}
2. 继承AbstractTransactionManagementConfiguration

ProxyTransactionManagementConfiguration类继承自AbstractTransactionManagementConfiguration抽象类,该抽象类实现了TransactionManagementConfigurer接口,负责配置事务管理器、事务属性等。

public abstract class AbstractTransactionManagementConfiguration implements TransactionManagementConfigurer {
    //...
}
3. 配置事务管理器

在ProxyTransactionManagementConfiguration类中,通过TransactionManagementConfigurer接口的默认实现,配置了默认的事务管理器。

@Configuration
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class AbstractTransactionManagementConfiguration implements TransactionManagementConfigurer {
    //...
    @Bean(name = TransactionManagementConfigUtils.TRANSACTION_MANAGER_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public PlatformTransactionManager transactionManager() {
        // 返回默认的事务管理器
    }
    //...
}
4. 创建事务通知器

ProxyTransactionManagementConfiguration类中还定义了一个名为transactionAdvisor的Bean,该Bean负责创建事务通知器,并将其应用于目标方法上。

@Configuration
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
    //...
    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public TransactionAttributeSource transactionAttributeSource() {
        // 返回事务属性源
    }

    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public TransactionInterceptor transactionInterceptor() {
        // 创建事务拦截器
    }

    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
        // 创建事务通知器,并将事务拦截器应用于目标方法
    }
    //...
}
5. 创建代理对象

ProxyTransactionManagementConfiguration类中还定义了一个名为transactionalMethodInterceptor的Bean,该Bean负责创建代理对象,并将事务拦截器应用于目标方法。

@Configuration
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
    //...
    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public TransactionInterceptor transactionInterceptor() {
        // 创建事务拦截器
    }

    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public TransactionalMethodInterceptor transactionalMethodInterceptor() {
        // 创建代理对象,并将事务拦截器应用于目标方法
    }
    //...
}

总结

本文深入探讨了Spring声明式事务管理的核心配置类之一——ProxyTransactionManagementConfiguration。

通过分析ProxyTransactionManagementConfiguration类的源码,我们了解了它的作用以及对声明式事务管理的重要性。

ProxyTransactionManagementConfiguration类负责配置和初始化事务相关的组件,并通过生成代理对象和应用事务拦截器,将事务管理逻辑织入到目标方法中,从而实现了声明式事务管理的功能。对于理解Spring框架中声明式事务的工作原理和实现机制具有重要意义。

不管做什么,只要坚持下去就会不一样!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SDA616 600KHz、16V、2A同步降压转换器

一般说明 该SDA616是一个完全集成,高效率2A同步整流降压转换器。该SDA616工作在一个宽的输 出电流负载范围高效率。该器件提供两种工作模式,PWM控制和PFM模式开关控制,它允许在更宽的负载范围内的高效率。 该SDA616需要一个现…

电脑开机后卡在开机LOGO画面如何排查处理

当电脑开机后长时间停滞在开机LOGO画面,无法继续进入操作系统,这一现象常令用户困扰不已。本文将深入探讨导致此类问题的多种可能原因,并提供相应的解决方法,帮助你有效地诊断和排除故障。 硬件故障或接触不良 1. 硬盘问题:硬盘是系统启动的关键组件,其故障或数据线接触…

RAG Survey

本文翻译自:Retrieval-Augmented Generation for Large Language Models: A Survey https://arxiv.org/pdf/2312.10997 文章目录 摘要一、INTRODUCTION二、RAG概述A. Naive RAGB. Advanced RAGC. Modular RAGD. RAG与微调 三、 检索A. 检索来源1) 数据结…

Qt客服端开发的组件库

Qt 是一个功能丰富的跨平台 C 应用程序框架,它包含了许多用于不同目的的组件库。以下是一些主要的 Qt 组件库,这些库为开发者提供了广泛的工具和功能,以便构建复杂的应用程序。北京木奇移动技术有限公司,专业的软件外包开发公司&a…

短信接口如何快速对接

短信大家都不陌生,基本上我们每天都会收到各种各样的短信,内容有些是营销类的,有些是数字验证码,有些是快递取件码类似的通知短信,这些短信内容都是通过短信接口触发来进行发送的,那么你知道短信接口如何快…

绘制签章 乱码问题 (踩坑日记)

签章汉字乱码问题 原因:我们在docker上因为没有汉字字体需要我们手动把文件打进去 注意点:如果开启了打包过滤加上字体不过滤 绘制签章转载

数海启航:数学与人工智能的深度交织

在人类文明的长河中,数学始终扮演着探秘未知、构建理论框架的基石角色。随着科技的飞速发展,尤其是人工智能(AI)的兴起,数学与这一前沿领域的结合愈发紧密,成为推动AI进步的最强引擎。 一、数学&#xff1a…

【操作系统复习资料】(持续更新中)

目录 第一章:操作系统引论 第二章:进程的描述与控制 未完待续。。。。。接 第三章:处理机调度与死锁 第四章:存储器管理 第五章:虚拟存储器 第六章:第八节 磁盘存储器的性能和调度 第一章&#xff1a…

Docker深入探索:网络与资源控制、数据管理与容器互联以及镜像生成

目录 一、 Docker网络 (一)Docker网络实现原理 (二)Docker网络模式 1. Bridge网络(默认) 2. Host网络 3. None网络 4. Container网络 5. 自定义网络 二、资源控制 (一)cgr…

windows下pysqlite3安装

pysqlite3 下载地址:SQLite Download Page windows下安装 首先在官网中下载以下文件 sqlite-amalgamation-3450300.zip #源码文件 sqlite-dll-win-x64-3450300.zip # 根据系统选择32或者64,可通过查看我的电脑属性中查看 sqlite-tools-win-x64-345…

万兆以太网MAC设计(9)数据流仲裁模块

文章目录 一、模块接口二、模块功能描述2.1、实现思路 三、仿真3.1、仿真设计3.2、仿真波形 总结: 一、模块接口 c0和c1表示输入的俩个数据通道,c0优先级高,P_ARBITER_LAYER 表示当前是在IP层进行仲裁还是MAC层,可复用于俩个模块…

每日算法之对称二叉树

题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 提示: …

c# 构造函数 静态构造函数 内联字段(即静态字段和实例字段) 父类构造函数 父类静态构造函数 父类内联字段 执行顺序

顺序如下: 1.子类的内联字段 2.子类的静态构造函数 3.父类的内联字段 4.父类的静态构造函数 5.父类的构造函数 6.子类的构造函数 7.子类的方法 public class A{public static string a1"A0";static A(){Console.WriteLine("父类内联字段:…

内网安全【1】——域信息收集/应用网络凭证/CS插件/Android/BloodHound

内容大纲: 概念名词: 局域网 (自己家) 工作组 (网吧) 内网域 (公司) 比如一家公司有1000台机器 运维人员去管理1000 不可能每台上去都进行软件的安装 环境的部署 密码的设置…

VSCODE通过SFTP链接VM进行开发

在vscode插件里面搜索sftp,安装。 安装之后,按ctrlshiftp,找到sftp的config 然后填写刚刚的IP,然后是你的用户名密码 如果是通过密钥链接的话就是这样配置 然后切换到这个sftp的tab里面 然后在你的项目右键,然后选择op…

Linux实现简单进度条(附原理解释和动图效果)

1&#xff0c;行缓冲区 先看下面的代码和运行结果&#xff0c; #include<stdio.h> #include<unistd.h> int main() {printf("你好\n");sleep(3);return 0; }只是一个简单的打印“你好”然后休眠三秒&#xff0c;最后程序结束 再看下面的代码和运行结果…

将阿里云中数据传输到其他超算服务器

目录 方法一&#xff1a;在阿里云中连接超算&#xff0c;然后使用rsync&#xff08;速度慢&#xff09; 方法2&#xff1a;rclone(速度很快&#xff0c;100G只花了大约20min) 方法一&#xff1a;在阿里云中连接超算&#xff0c;然后使用rsync/scp&#xff08;速度慢&#xff0…

JMeter 请求头信息配置详解

在进行 Web 测试和 API 测试时&#xff0c;正确配置 HTTP 请求头是关键步骤之一&#xff0c;尤其当使用诸如 JMeter 这样的强大工具时。在本文中&#xff0c;我将详细介绍如何在 JMeter 中有效地配置和管理HTTP请求头。 在 JMeter 中添加和配置 HTTP 请求头 步骤 1: 打开 HTT…

【MATLAB源码-第195期】基于matlab的OFDM,UFMC,FBMC三种通信系统误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;正交频分复用&#xff09;、UFMC&#xff08;通用频率分割复用&#xff09;、FBMC&#xff08;滤波器组多载波&#xff09;是目前无线通信领域中使用较广的几种多载波调制技术。随着无线通信技术的飞速发展&…

伦敦金的交易时间段都适合投资吗?

是所有的交易时间段都适合投资。首先&#xff0c;让我们了解伦敦金的交易时间。伦敦金市场的交易时间分为两个主要时段&#xff1a;亚洲盘和欧美盘。亚洲盘通常在北京时间早晨6点至下午5点半左右&#xff0c;而欧美盘则从北京时间晚上8点半开始&#xff0c;一直到次日早晨4点半…