Spring源码阅读:Spring事务传播特性

news2025/1/11 19:51:28

一、概述

我们平常工作中经常会听到事务的传播级别,但是使用中基本不会太调整这个事务传播级别,因为没什么业务场景需要我们这么做,只需要使用原有的事务传播级别即可解决95%的业务场景。但是为了那5%的业务场景,我们还是还要学习。事务的传播级别实际上规定了方法与方法之间相互调用时事务之间是如何传播的。例如:A方法的事务传播级别是REQUIRED,B方法的事务传播级别是NEVER,那么A调用B的事务是如何运行的?此时B是不支持事务的,A调用B会抛出异常。

        在这里我们做一个形象的比喻,把事务当作妻子,而事务传播级别相当与娶妻的思想。NEVER传播级别相当于欧洲中世纪的神父的结婚约束,不允许结婚。REQUIRED相当与阿拉伯的结婚制度,如果没有老婆就找个老婆,如果又找到一个老婆就加入当前的家庭,两者地位平等。NOT_SUPPORTED永远不结婚,即使又喜欢的女孩子也会用不结婚的方式与其保持关系。MANDATORY类似于中国大部分家长的思想,必须要结婚,不结婚的人生无法往下继续执行。REQUIRES_NEW就相当于重婚,喜欢上多个女孩,并和他们都结婚,组成了多个不同的家庭。SUPPORTS就像有钱的中年男人,在又家庭的情况下,遇到其它喜欢的女孩子,以非婚姻的方式保持关系。NESTED相当于古代的婚姻制度,只有一个正妻,其他娶进来的都是妾,两者地位是从属关系。

下图为事务传播特性图:

二、案例分析

  外层的传播特性为REQUIRED,首先外层会新建一个事务TransactionInfo,如果已存在事务,那么内存的事务该如何执行?我们接着往下分析。

  AbstractPlatformTransactionManager#getTransaction 获取事务状态核心伪代码:

// 获取事务信息
public final TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException {

  // 若不指定事务定义,则使用默认的事务定义StaticTransactionDefinition
  TransactionDefinition def = (definition != null ? definition : TransactionDefinition.withDefaults());

  // 获取数据源对象 DataSourceTransactionObject
  Object transaction = doGetTransaction();
  boolean debugEnabled = logger.isDebugEnabled();

  // 若已存在事务,按已存在事务流程执行
  if (isExistingTransaction(transaction)) {
    return handleExistingTransaction(def, transaction, debugEnabled);
  }
}

  AbstractPlatformTransactionManager#doGetTransaction 获取数据源属性对象核心代码:创建数据源属性对象,并设置是否允许当前事务设置保存点,并获取数据源对应的jdbc连接,设置进数据源属性对象中。

// 创建数据源属性对象,并填充属性
protected Object doGetTransaction() {
   // 创建一个数据源事务对象
   DataSourceTransactionObject txObject = new DataSourceTransactionObject();
   // 是否允许当前事务设置保存点
   txObject.setSavepointAllowed(isNestedTransactionAllowed());
   // 对于内层被增强方法而言,数据源对应的jdbc连接在创建新事务时, 在事务同步管理器中已经完成初始化,此处事务管理器的jdbc连接不为空
   ConnectionHolder conHolder =
         (ConnectionHolder) TransactionSynchronizationManager.getResource(obtainDataSource());
   txObject.setConnectionHolder(conHolder, false);
   // 返回事务对象
   return txObject;
}

  DataSourceTransactionManager#isExistingTransaction 是否已存在事务核心代码

protected boolean isExistingTransaction(Object transaction) {
   DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;
    // 判断数据源事务对象中是否有连接持有器,并且事务处理激活状态
    return (txObject.hasConnectionHolder() && txObject.getConnectionHolder().isTransactionActive());
 }

执行已存在事务流程概览:

1、内层传播特性为NEVER

  当前事务行为为PROPAGATION_NEVER, 不支持事务,但是当前又存在一个事务,所以抛出异常

2、内层传播特性为NOT_SUPPORTED

  当前事务行为为PROPAGATION_NOT_SUPPORTED, 挂起已经存在的事务, 以非事务状态运行

3、内层传播特性为REQUIRES_NEW

  当前事务行为为PROPAGATION_REQUIRES_NEW,挂起已经存在的事务,开启一个新事务

4、内层传播特性为NESTED

  当前事务行为PROPAGATION_NESTED,判断是否允许嵌套事务,不允许,抛异常;

  否则,判断是否使用保存点执行Nest事务,若使用保存点,创建事务状态对象,并为当前事务创建一个保存点,返回事务状态对象;

  若不使用保存点执行Nest事务,开启一个新事务执行

5、内层传播特性为REQUIRED

  当前事务行为PROPAGATION_REQUIRED,创建事务状态对象,newTransaction标识设置为false,标识不是一个新事务,并返回事务状态对象。不是一个新事务代表,jdbc连接用的是同一个,在异常未捕获时,若发生回滚则一起回滚。

参考文章:

Spring事务传播:REQUIRED、REQUIRES_NEW、NESTED事务传播举例对比_事务传播机制nested_加尔维娅的博客-CSDN博客

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

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

相关文章

半边圆角和选中

为了这效果肝了几天,调了几天,改了几天,头都晕了! 在 ViewBinder 里设置背景 adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder(){public boolean setViewValue(View view, Cursor cursor, int columnIndex){ …

如何理解驱动程序、设备树、platform、device、driver之间的关系

前言 利用设备树来使用或者编写驱动程序,需要梳理哪些概念? 如何理解驱动程序、设备树、platform、device、driver之间的关系 前言一、总线设备驱动模型——总线、设备、驱动二、从代码中看driver与device的关系三、设备树的应用(一&#xf…

简单分享生鲜超市怎么做同城配送小程序

1、蔬菜生鲜产品展示:用户打开买菜必备软件,就能查看琳琅满目的新鲜水果、蔬菜、肉类、零食等产品,为用户展示更多信息,提升用户下单率。经常更新商品的照片、视频,让客户可以在线浏览和挑选,足不出户就能买…

Baumer工业相机堡盟工业相机通过BGAPISDK使用图像回调函数全帧率保存图像(C++)

Baumer工业相机堡盟工业相机通过BGAPISDK使用图像回调函数全帧率保存图像(C) Baumer工业相机Baumer工业相机全帧率保存的技术背景Baumer工业相机通过BGAPISDK使用相机图像回调函数1.引用合适的类文件2.通过BGAPISDK在相机图像回调函数全帧率保存 Baumer工…

LabVIEWCompactRIO 开发指南31 在LabVIEW FPGA中使用DMA FIFO

LabVIEWCompactRIO 开发指南31 在LabVIEW FPGA中使用DMA FIFO 要为流数据创建DMA缓冲区,请右键单击FPGA目标并选择New...FIFO。为FIFO结构指定一个描述性名称,并选择“target to host”作为类型。这意味着数据应该通过这个DMA FIFO从FPGA目标流向实时主…

“饶派杯”XCTF车联网安全挑战赛战队巡礼!

2023年5月31日,“饶派杯” XCTF车联网安全挑战赛将于江西省上饶市重磅开赛。本届大赛由江西省委网信办、江西省工信厅、上饶市人民政府主办,旨在深入贯彻落实国家网络强国和交通强国战略部署,推动智能网联汽车技术与产业发展、加快该领域人才…

大数据(三)大数据技术栈发展史

-系列目录- 大数据(一)背景和概念 大数据(二)大数据架构发展史 大数据(三)大数据技术栈发展史 前两章,我们分析了大数据相关的概念和发展史,本节我们就讲一讲具体的大数据领域的常见技术栈发展史。对主流技术栈有一个初步的认知。 一、总览 大数据技术栈…

课程分享:鸿蒙HarmonyOS系统及物联网开发实战课程(附课程视频及源码下载)

课程名称: 鸿蒙HarmonyOS系统及物联网开发实战课程 课程介绍: HarmonyOS 是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS 提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c…

设计模式之【状态模式】,如何设计一个“状态管理大师”

文章目录 一、什么是状态模式1、状态模式使用场景2、状态模式优缺点3、状态模式的三大角色4、状态模式与责任链模式的区别5、状态模式与策略模式的区别 二、实例1、状态模式的一般写法(1)简单写法(2)进阶写法(3&#x…

redis的优化和持久化

持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下…

在 Android 手机上恢复出厂设置后恢复照片的 4 种简单方法(新方法)

“嗨,谁能帮我恢复我的照片,因为我不小心恢复了出厂设置,而且我没有做备份?几个月来我一直试图通过使用恢复软件来恢复我的照片,root 了一个深扫描,但没用……” 恢复出厂设置可以清除电子设备的所有信息并…

【arxiv】找论文idea : 关于 SAM 的论文扫读(二)

文章目录 一、A Comprehensive Survey on Segment Anything Model for Vision and Beyond二、Segment Anything Model (SAM) Enhanced Pseudo Labels for Weakly Supervised Semantic Segmentation三、How Segment Anything Model (SAM) Boost Medical Image Segmentation?四、…

OJ万题详解––组合线段(C++详解)

好久没有更新博文了,我上一篇博文的发布时间还是: 题目 这是我们周考的第二道题,乍一看,很简单,仔细做,更简单。(我都没做起) 分析 我相信,很多人第一次看到这个题目就…

Nginx安装与使用

文章目录 1. 🪐Nginx-概述1.1 介绍1.2 下载和安装1.2.1 官网下载1.2.2 网盘下载1.2.3 安装 1.3 目录结构 2. 🪐Nginx-命令2.1 常用命令2.2 环境变量配置 3. 🪐Nginx-应用3.1 配置文件结构3.2 部署静态资源3.2.1 介绍3.2.2 测试 3.3 反向代理3…

conda 笔记 conda命令收集

1 conda相关命令 conda info 判断conda是否正常安装检查conda版本号 conda update -n base conda 将conda更新到当前版本 conda update anaconda 将所有的package尽量更新到最新的版本加尽量的原因是,包裹之间可能会有冲突,所以需要优先保证packa…

玩转ChatGPT:制作思维导图

一、写在前面 最近,在学习深度学习图像识别的相关知识和代码,想着能否用小Chat搞一个思维导图。 简单问小Chat: 咒语:我怎么使用你做一个思维导图?需要配合什么软件生成?? 大意就是&#xff…

JavaEE(系列11) -- 多线程案例4(线程池)

目录 1. 线程池 2. 创建线程池 2.1 Executors类 2.2 ThreadPoolExecutor类 3. 自己实现线程池 1. 线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈…

百分位数、数据分布、直方图、正态数据分布

目录 1、百分位数 2、数据分布 3、正态数据分布 1、百分位数 统计学中使用百分位数(Percentiles)提供一个数字,该数字描述了给定百分比值小于的值。 例如:假设我们有一个数组,包含一时刻一条街上人的年龄 arr […

搜索二维矩阵——力扣74

文章目录 题目描述法一)一次二分查找法二)两次二分查找法三)抽象二叉搜索树BST解法 题目描述 法一)一次二分查找 首先分析题目:由于①每行的整数从左到右升序;②每行的第一个整数>前一行的最后一个整数&…

AC和AP和STA信息查询

AC和AP和STA信息查询 1、AC的运行统计信息1.1、查看设备的部件类型及状态信息 2、AP的运行统计信息2.1、AP的运行信息 / 查看RU的运行信息2.2、AP性能统计信息2.3、AP的射频信息2.4、AP重启失败的记录2.5、非法AP的存在情况2.6、设备信道切换的记录信息2.7、查看指定AP射频上的…