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

一、概述

 

我们平常工作中经常会听到事务的传播级别,但是使用中基本不会太调整这个事务传播级别,因为没什么业务场景需要我们这么做,只需要使用原有的事务传播级别即可解决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博客

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

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

相关文章

完美解决接口测试难题,数据驱动带签名混合封装框架实现

目录 前言: 一、框架概述 二、框架架构 三、代码实现 四、实战步骤 五、总结 前言: 接口自动化测试是保障软件质量的重要手段之一,其自动化程度越高,越能有效提高软件测试效率。而接口自动化测试中,接口测试框架…

Springboot +spring security,解决跨域问题

一.简介 这篇文章主要是解释什么是跨域,在Spring中如何解决跨域,引入Spring Security后Spring解决跨域的方式失效,Spring Security 如何解决跨域的问题。 二.什么是跨域 跨域的概率: 浏览器不能执行其他网站的脚本&#xff0c…

【新星计划-2023】TCP/IP协议讲解

相信大家在学习的过程中一定听到过TCP/IP这个协议,那么,TCP/IP协议是什么?为什么会有TCP/IP协议? 一、TCP/IP是什么? TCP/IP是用于计算机通信的一组协议,我们通常称它为TCP/IP协议族。它是70年代中期美国…

Taro 项目怎么获取元素的高度和视口高度

最近做小程序,用的Taro,需要设置空状态居中显示,因为空状态出现的地方不一样,所以需要动态设置,那么就需要获取元素的高度来计算 文档翻了一遍也没有找到,原生js获取高度得到的是null,百度了下…

考研数据结构--图

文章目录 图图的基本概念图的定义种类 图的抽象数据类型图的基本术语1. 端点和邻接点2. 顶点的度、入度和出度3. 完全图4. 稠密图、稀疏图5. 子图6. 路径和路径长度7. 回路或环8. 连通、连通图和连通分量9. 强连通图和强连通分量在一个图中找强连通分量的方法 10. 权和网 图的存…

自信裸辞:一晃 ,失业都3个月了.....

最近,找了很多软测行业的朋友聊天、吃饭 ,了解了一些很意外的现状 。 我一直觉得他们技术非常不错,也走的测开/管理的路径;二三月份裸辞的,然后一直在找工作,现在还没找到工作 。 经过我的分析&#xff0…

2023年广东省中职网络安全Web渗透测试解析(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.访问地址http://靶机IP/task1,分析页面内容,获取flag值,Flag格式为flag{xxx}; 2.访问地址http://靶机IP/task2,访问登录页面。用户user01的密码为1-1000以内的数,获取用户user01的密码,将密码作为Flag进行提交,Flag格式…

如何真正开启docker远程访问2375

注意看官方文档 Configure remote access for Docker daemon | Docker Documentation 1. windows上Docker Desktop开启远程访问端口2375 系统版本: win10专业版 Docker Desktop版本:4.18.0 很简单勾上, 应用并重启即可 2. linux上开启 尝…

设计模式—“接口隔离”

在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采样添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式有:Fascade、Proxy、Adapter、Mediator 一、Fascade 动机 上述A方案的问题在于组件的客户和…

性能测试重要知识与TPS上不去原因分析,测试进阶之路卷起来...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 常见性能测试术语…

音视频使用qt测试ffmpeg接口时无法运行

仅仅时把自己过程中遇到的稍微阻塞疑惑问题做出整理,疑惑的是拿到的ffmpeg包中没有dll文件,导致自己研究了一系列。 使用qt加载音视频ffmpeg对应的相关lib库,进行接口,源码的研究。 1:使用源码安装的方式获取相关的动…

易基因:全基因组DNA甲基化分析揭示DNMT1在斑马鱼模型听觉系统发育中的作用 | 胚胎发育

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 听力障碍通常与内耳发育不全或损伤有关,是影响生活质量的严重健康问题。因此研究听觉器官发生过程中的关键基因对于探索听力损伤的潜在策略至关重要。斑马鱼模型在理解内耳发…

基于SSM的校园办公管理系统的设计与实现(源码完整)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题,今天给…

噶了呀,现在的00后这么卷的吗?

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪20K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里…

企业微信也能接入ChatGPT啦~你也能成功,步骤超详细~

文章目录 配置企业微信创建企业创建应用 配置项目一、OpenAI账号注册二、克隆项目代码三、复制配置文件四、企业微信配置 服务器购买运行项目安装Python安装核心依赖启动项目 个人微信绑定 上次我把ChatGPT接入了微信(请看这篇文章当ChatGpt接入微信群之后&#xff…

前几天面了个30岁左右的测试员,年薪50w问题基本都能回答上,必是刷了不少八股文···

互联网行业竞争是一年比一年严峻,作为测试工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯等大厂.....) 所以,大家就迎来了…

论文笔记: Trajectory Clustering: A Partition-and-Group Framework

07 Sigmoid 使用类DBSCAN的思路对轨迹聚类 1 intro 1.1 轨迹聚类 现有的轨迹聚类算法是将相似的轨迹作为一个整体进行聚类,从而发现共同的轨迹。 但是这样容易错过一些共同的子轨迹(sub-trajectories)。而在实际中,当我们对特…

Redis主从复制,哨兵模式和集群模式

一、主从复制 1、主从复制-哨兵-集群 主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自…

服务器被勒索病毒攻击怎么办,如何进行勒索病毒解密与预防工作?

在当今社会中服务器已经成为企业关键数据存储和传输的重要载体,同样也成为黑客攻击和勒索病毒的首要目标。一旦服务器被勒索病毒攻击,企业的正常运转与经济利益和核心数据都将受到威胁。下面将为大家介绍一下服务器被勒索病毒攻击后应该采取怎样的措施及…

软件系统三基座之一:权限管理

软件系统三基座包含:权限管理、组织架构、用户管理。 何为基座,即是有了这些基础,任一相关的“建筑”就能逐步搭建起来。 万丈高楼平地起 一、为什么要权限管理 权限管理,一般指根据系统设置的安全规则或者安全策略,…