当前位置: 首页 > news >正文

【Spring传播机制底层原理】

一、Spring的事务传播机制

Spring的事务传播机制是Spring框架中最核心的机制之一,它能够灵活地控制多个事务方法的执行顺序、提交或回滚等行为。在Spring中,事务是通过TxManager来管理的,TxManager是一个接口,提供了开启、提交、回滚、检查和暂停某个事务等多种方法。Spring框架本身不提供事务管理的实现,而是通过和其他事务管理器进行整合来完成。常见的事务管理器有:JDBC、Hibernate、JPA和Atomikos等。

Spring支持以下7种事务传播行为:

  1. PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;否则新建事务,并在方法执行结束后提交事务。
  2. PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;否则不开启事务。
  3. PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;否则抛出异常。
  4. PROPAGATION_REQUIRES_NEW:不管当前是否存在事务,都新建一个事务,并在方法执行结束后提交事务。
  5. PROPAGATION_NOT_SUPPORTED:不管当前是否存在事务,都不开启事务。
  6. PROPAGATION_NEVER:如果当前存在事务,则抛出异常;否则不开启事务。
  7. PROPAGATION_NESTED:如果当前存在事务,则在已有事务中嵌套一个事务;否则新建事务,并在方法执行结束后提交事务。

以上这些传播行为都可以通过Spring中的TransactionDefinition接口进行定义和设置。

二、Spring的事务传播机制的实现原理

在Spring框架内部,事务的传播机制是通过ThreadLocal对象来实现的。ThreadLocal是一个线程本地变量,它可以在当前线程中存储某个值,并且这个值可以被当前线程的任何方法所共享和修改。在Spring中,我们可以通过TransactionSynchronizationManager类来管理ThreadLocal变量。

在Spring中,开启事务的方法通常被称为事务模板方法。事务模板方法负责创建事务,并且将当前线程的状态保存在ThreadLocal变量中。在执行业务方法前,Spring事务管理器会检查当前线程的状态,如果当前线程已经存在事务,则直接使用该事务;否则创建一个新事务。

在Spring中,每个事务方法都是由一个或多个拦截器组成的。事务拦截器负责拦截业务方法执行前后的各种事件,并且在恰当的时候执行提交或回滚事务等操作。在Spring中,我们可以通过TransactionInterceptor类来实现事务拦截器。

在Spring的事务传播机制中,每个事务方法都是独立的,它们的事务行为是相互独立的。在事务方法内部调用其他事务方法时,Spring会根据所设置的传播行为来决定是否开启新事务,或者将当前事务合并到已有事务中。

Spring的事务传播机制是基于AOP实现的,它首先在调用业务方法之前,开启事务,并将事务状态保存在ThreadLocal变量中;然后执行业务方法;最后在业务方法执行结束后,根据事务状态来决定是提交还是回滚事务。

三、Spring的事务传播机制的源代码实现

接下来,我们将以Spring 5.3.0版本为例,通过源代码的方式来分析Spring的事务传播机制的实现细节。在此之前,我们需要先了解Spring的事务管理API和核心类的结构。

  1. Spring的事务管理API

Spring的事务管理API主要包括以下三个接口:

PlatformTransactionManager是事务管理器的顶层接口,它定义了使用事务的基本方法,如开启、提交、回滚、暂停、恢复等。所有的事务管理器都需要实现PlatformTransactionManager接口。

TransactionDefinition是事务定义接口,它定义了一个事务的属性,如事务的隔离级别、传播行为、超时时间和只读属性等。所有的事务管理器必须支持TransactionDefinition接口的所有属性。

TransactionStatus是事务状态接口,它定义了事务的当前状态,例如是否已经开始、是否已经提交、是否已经回滚等。所有的事务管理器必须支持TransactionStatus接口的所有状态。

  1. Spring的核心类

Spring的事务传播机制的实现主要涉及以下几个核心类:

TransactionSynchronizationManager是Spring事务同步管理器,它负责处理同步回调和资源清理,以及管理线程本地变量资源。 在Spring的事务传播机制中,TransactionSynchronizationManager使用ThreadLocal来保存当前线程的事务状态和事务资源。

TransactionAspectSupport是Spring事务切面支持类,它是Spring事务传播机制的核心实现类。TransactionAspectSupport类继承自AspectJAfterAdvice类,实现了org.aopalliance.intercept.MethodInterceptor接口,它可以作为一个通用的事务拦截器来拦截任何一个Spring Bean中的方法调用,并根据所设置的传播行为来决定是否开启新事务,或者将当前事务合并到已有事务中。

AbstractPlatformTransactionManager是PlatformTransactionManager接口的抽象实现类,它提供了大部分的PlatformTransactionManager接口方法的默认实现,具体实现细节由其子类来完成。

AbstractTransactionStatus是TransactionStatus接口的抽象实现类,它提供了大部分的TransactionStatus接口方法的默认实现,具体实现细节由其子类来完成。

相关文章:

【Spring传播机制底层原理】

一、Spring的事务传播机制 Spring的事务传播机制是Spring框架中最核心的机制之一,它能够灵活地控制多个事务方法的执行顺序、提交或回滚等行为。在Spring中,事务是通过TxManager来管理的,TxManager是一个接口,提供了开启、提交、…...

python通过tkinter制作词云图工具

一、基本功能 1.采取上传文本文档(仅支持.txt格式)的方式统计词频 2.背景图形样式可选择已经设定好的,也可选择本地上传的(支持.png .jpg .jpeg格式) 3.本地上传的图片需要进行抠图处理,并将抠图结果保存…...

Java-钉钉订阅事件

文章目录 背景什么是钉钉订阅事件钉钉订阅事件的应用场景 整体思路查看钉钉文档 什么是钉钉回调钉钉回调具体实操创建自己的应用钉钉回调开发过程中遇到的问题 总结 背景 最近需要做一个业务:钉钉组织架构下添加人员之后,要对该人员的数据信息做一个处理…...

【DataV/echarts】vue中使用,修改地图和鼠标点击部分的背景色

引入:使用 DataV 引入地图的教程是参考别人的,主要介绍修改地图相关的样式; 引入地图 是参考别人的,这里自己再整理一遍,注意需要安装 5 版本以上的 echarts; DataV 网址:https://datav.aliyun.…...

系统设计类题目汇总四

25 十个异步入库任务,如何保证他们原子入库? 了解了你的问题背景,确保10个异步入库任务原子性执行(即要么全部成功,要么全部失败)有以下几种方法: 数据库事务: 如果所有的入库操作都是在同一个…...

【C++心愿便利店】No.5---构造函数和析构函数

文章目录 前言一、类的6个默认成员函数二、构造函数三、析构函数 前言 👧个人主页:小沈YO. 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C 心愿便利店 🔑本章内容:类…...

微软研究院团队获得首届AI药物研发算法大赛总冠军

编者按:AI 药物研发是人工智能未来应用的重要方向之一。自新冠病毒(SARS-CoV-2)首次爆发以来,新冠病毒的小分子药物研发备受关注,于近期举行的首届 AI 药物研发算法大赛便聚焦于此。在比赛中,来自微软研究院…...

redis实战篇之导入黑马点评项目

1. 搭建黑马点评项目 链接:https://pan.baidu.com/s/1Q0AAlb4jM-5Fc0H_RYUX-A?pwd6666 提取码:6666 1.1 首先,导入SQL文件 其中的表有: tb_user:用户表 tb_user_info:用户详情表 tb_shop:商户…...

【C++】详解红黑树并模拟实现

前言: 上篇文章我们一起学习了AVL树比模拟实现,我们发现AVL树成功地把时间复杂度降低到了O(logN)。但是同时我们不难发现一个问题,在构建AVL树中我们也付出了不小的代价,频繁的旋转操作导致效率变低。为了解决这个问题&#xff0c…...

Matlab图像处理-最大类间方差阈值选择法(Otsu)

基本思想 最大类间方差阈值选择法又称为Otsu 算法,该算法是在灰度直方图的基础上用最小二乘法原理推导出来的,具有统计意义上的最佳分割阈值。它的基本原理是以最佳阈值将图像的灰度直方图分割成两部分,使两部分之间的方差取得最大值&#x…...

Spring Cloud(Finchley版本)系列教程(三) 服务消费者(Feign)

Spring Cloud(Finchley版本)系列教程(三) 服务消费者(Feign) 一、Feign和OpenFeign的对比 Feign是Netflix公司写的,是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端,是SpringCloud中的第一代负载均衡客户端。OpenFeign是SpringCloud自己研发的,在Feign的基础上支…...

AI图片生成 discord 使用midjourney

参考: 不用找咒语了!Midjourney图生文功能特征解析,玩转Describe命令,快速搞定AI绘画_哔哩哔哩_bilibili 1 登录 discord 2 点发现 找 midjourney 3 创建 服务器 -> 亲自创建 4 选 仅供我和我的朋友使用 5 起个 服务器名字 6 加bot 由于…...

gitlab 点击Integrations出现500错误

背景:在新服务器重新搭建了gitlab,并导入原来gitlab的备份,在项目中点击点击Integrations出现500错误。 解决方法:1.进入新服务器,将 /etc/gitlab/gitlab-secrets.json重命名为 /etc/gitlab/gitlab-secrets.json.bak …...

【2023高教社杯】A题 定日镜场的优化设计 问题分析及数学模型

【2023高教社杯】A题 定日镜场的优化设计 问题分析及数学模型 1 题目 构建以新能源为主体的新型电力系统,是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(…...

rac异常hang死故障分析(sskgxpsnd2)

x86虚拟化的平台麒麟系统的一套RAC。事件梳理20:24左右,发现一个节点hang死,关闭操作没有响应。关闭hang死节点,另一个节点也发生hang死,然后重启了另一个节点。 无效分析部分 检查gi的alert日志 有一个很大跨度的时间回退 再看…...

2023.9.7 关于 TCP / IP 的基本认知

目录 网络协议分层 TCP/IP 五层(四层)模型 应用层 传输层 网络层(互联网层) 数据链路层(网络接口层) 物理层 网络数据传输的基本流程 网络协议分层 为什么需要分层? 分层之后&#xff0c…...

Python 图片处理

Step1 提取PDF中的图片,并另存 Step2 去除灰色纸张背景 import PyPDF2 from PIL import ImageEnhance,Image,ImageFilter import cv2 import numpy as np from skimage.filters import unsharp_mask from skimage.filters import gaussian from skimage.restora…...

信道估计 | 信道

文章目录 定义分类LS 估计MMSE估计LS vs MMSE 定义 从接收数据中将假定的某个信道模型参数估计出来的过程,如果信道是线性的,信道估计是对系统的冲击响应进行估计,需强调的是,信道估计是信道对输入信号影响的一种数学表示&#x…...

腾讯发布超千亿参数规模的混元大模型;深度学习与音乐分析与生成课程介绍

🦉 AI新闻 🚀 腾讯发布超千亿参数规模的混元大模型 摘要:腾讯在2023腾讯全球数字生态大会上发布混元大模型,该模型拥有超千亿的参数规模和超2万亿 tokens 的预训练语料。混元大模型将支持多轮对话、内容创作、逻辑推理、知识增强…...

[html]当网站搭建、维护的时候,你会放个什么界面?

效果图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网站建设中</title><style>/* 基础样式 */body, html {margin: 0;padding: 0;height: 100%;font-family: Arial, sa…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...