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

Spring事务传播机制

Spring事务传播机制

  • 回顾
  • 简单介绍
  • 事务的传播机制有哪些
    • Propagation.REQUIRED
    • Propagation.SUPPORTS
    • Propagation.MANDATORY
    • Propagation.REQUIRES_NEW
    • Propagation.NOT_SUPPORTED
    • Propagation.NEVER
    • Propagation.NESTED
  • 实例
    • REQUIRED
    • REQUIRES_NEW
    • NEVER
    • NESTED
    • REQUIRED和NESTED的区别

回顾

在这里插入图片描述

之前我们学习了Spring如何进行事务的实现和运用,今天我们来学习Spring事务的传播机制

简单介绍

Spring事务的传播机制就是当存在多个事务的时候,且多个事务方法存在调用关系,事务是如何在这些方法中进行传播的

事务的传播机制有哪些

@Transactional注解支持事务传播机制的设置,通过propagation属性来指定传播行为,
以A方法调用B方法为例,A⽅法运⾏时, 会开启⼀个事务. 当A调⽤B时, B⽅法本⾝也有事务, 此时B⽅法运⾏时, 是加⼊A的事务, 还是创建⼀个新的事务呢(使用自己的事务)?这个就涉及到了事务的传播机制.
Spring事务传播有以下七种机制:

Propagation.REQUIRED

默认的事务传播级别. 如果A存在事务, 则B加⼊该事务. 如果A没有事务, 则创建⼀个新的事务(事务中包含AB).

Propagation.SUPPORTS

如果A存在事务, 则B加⼊该事务. 如果A没有事务, 则A,B以都以⾮事务的⽅式继续运⾏.

Propagation.MANDATORY

强制性. 如果A存在事务, 则B加⼊该事务. 如果A没有事务, 则抛出异常.

Propagation.REQUIRES_NEW

创建⼀个新的事务(B) 如果A存在事务, 则把A事务挂起. 也就是说不管A⽅法是否开启事务, Propagation.REQUIRES_NEW修饰的B⽅法都会新开启一个事务, 且开启的事务相互独⽴, 互不⼲扰,就算A用A的事务,B用B的事务,A没有就算了

Propagation.NOT_SUPPORTED

B以⾮事务⽅式运⾏, 如果A存在事务, 则把A事务挂起(不⽤).

Propagation.NEVER

以⾮事务⽅式运⾏, 如果A存在事务, 则抛出异常.

Propagation.NESTED

如果A存在事务, 则创建⼀个事务作为A事务的嵌套事务来运⾏. 如果A没有事务, 则该取值等价于PROPAGATION_REQUIRED

实例

上面其中机制,我们只需要重点掌握两个:
REQUIRED
REQUIRES_NEW

REQUIRED

@RestController
public class PropagationController {@Autowiredprivate UserInfoService userInfoService;@Autowiredprivate LogInfoService logInfoService;@Transactional( propagation = Propagation.REQUIRED)@RequestMapping("/insertInfo")public void insertInfo(String userName,String password){userInfoService.insert(userName,password);logInfoService.insert(userName,"用户注册成功");}
}
@Service
public class LogInfoService {@Autowiredprivate LogInfoMapper logInfoMapper;@Transactional( propagation = Propagation.REQUIRED)public Integer insert(String userName, String op) {Integer i = 10/0;return logInfoMapper.insert(userName,op);}
}
@Service
public class UserInfoService {@Autowiredprivate UserInfoMapper userInfoMapper;@Transactional( propagation = Propagation.REQUIRED)public Integer insert(String userName, String password) {return userInfoMapper.insert(userName,password);}
}

运⾏程序,程序报错,发现数据库没有插⼊任何数据
流程描述:

  1. insertInfo⽅法开始事务
  2. ⽤⼾注册, 插⼊⼀条数据 (执⾏成功) (和insertInfo使⽤同⼀个事务)
  3. 记录操作⽇志, 插⼊⼀条数据(出现异常, 执⾏失败) (和insertInfo使⽤同⼀个事务)
  4. 因为步骤3出现异常, 事务回滚. 步骤2和3使⽤同⼀个事务 所以步骤2的数据也回滚了

REQUIRES_NEW

将上述代码中将上述UserService和LogService的传播机制改为 REQUIRES_NEW
运行程序,我们观察程序,可以看到,user_info中已经成功新增了一条数据,但是log_info中却并没有成功
这是因为REQUIRES_NEW的调用方与被调用着的事务是独立的,之间互不影响.

NEVER

将UserService中的事务传播机制改为NEVER
运行程序,程序报错,数据也没有插入成功,这是因为NEVER的调用方不能有事务,否则会报错,并回滚

NESTED

将UserService和LogService中的传播机制改为NESTED
运行程序,发现似乎和REQUIRED一样,但是当我们手动给LogService进行回滚,就会发现,日志表新增失败了,但是用户表注册成功了,也就是说,调用方的事务包含被调用者的事务,但是被调用者的事务也是一个独立的事务,因此可以实现局部回滚

REQUIRED和NESTED的区别

整个事务如果全部执⾏成功, ⼆者的结果是⼀样的
如果事务⼀部分执⾏成功, REQUIRED加⼊事务会导致整个事务全部回滚. NESTED嵌套事务可以实现局部回滚, 不会影响上⼀个⽅法中执⾏的结果

相关文章:

Spring事务传播机制

Spring事务传播机制 回顾简单介绍事务的传播机制有哪些Propagation.REQUIREDPropagation.SUPPORTSPropagation.MANDATORYPropagation.REQUIRES_NEWPropagation.NOT_SUPPORTEDPropagation.NEVERPropagation.NESTED 实例REQUIREDREQUIRES_NEWNEVERNESTEDREQUIRED和NESTED的区别 回…...

智能分析网关V4+EasyCVR视频融合平台——高速公路交通情况的实时监控和分析一体化方案

随着2024年春运帷幕的拉开,不少人的返乡之旅也即将开启,从这几日的新闻来看,高速上一路飘红。伴随恶劣天气,加上激增的车流,极易导致高速瘫痪,无法正常使用。为解决此问题,助力高速高效运营&…...

Vue3.0(一):Vue的引入-options api-模板语法

Vue的引入方式 CDN方式进行引入 将以下 script标签引入即可 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script><!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><met…...

API网关-Apisix多节点搭建(RPM包方式)

文章目录 前言一、介绍1. 端口介绍2. APISIX节点介绍3. apisix单机安装配置教程(选看) 二、准备1. 配置集群免密登录2. 搭建etcd集群 三、安装apisix节点1. 复制脚本2. 增加执行权限3. 分发脚本4. 执行脚本5. 配置apisix的etcd集群地址 四、安装apisix-dashboard1. 复制脚本2. …...

HAL库配置片内FLASH读写

一、FLASH简介 不同型号的 STM32F40xx/41xx&#xff0c;其 FLASH 容量也有所不同&#xff0c;最小的只有 128K 字节&#xff0c;最大 的则达到了 1024K 字节。我们的探索者开发板选择的是 STM32F407ZGT6 的 FLASH 容量为 1024K 字节。 主存储器&#xff0c;存放代码和数据常数&…...

日志记录——单片机可执行文件合并

一&#xff1a;需求场景 现在有一片单片机&#xff0c;执行程序包括自定义boot和应用程序app, 在将打包好的固件给到生产是有以下问题&#xff0c;由于要通过jlink烧录boot&#xff0c;然后上电启动boot&#xff0c;通过boot烧录初始化程序&#xff0c;过程过于复杂&#xff0…...

2024数模美赛C题F题完整代码结果展示

C&#xff1a;Momentum in Tennis 实在精力有限&#xff0c;完整讲解可以移步去看我的讲解视频啦&#xff1a; 美赛C题每一问代码结果讲解及进度说明 F&#xff1a;Reducing lllegal Wildlife Trade 实在精力有限&#xff0c;完整讲解可以移步去看我的讲解视频啦&#xff1a; ​…...

H5调用安卓原生相机API案例

1、在activity_main.xml文件里添加webview标签 <WebViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent"> </WebView> 2、AndroidManifest.xml(权限和活动声明) 开启访问…...

Java面试——计网篇

一、基础篇 1、 TCP/IP 网络模型 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通信&#xff0c;而设备是多样性的&#xff0c;所以要兼容多…...

函数式接口当参数使用

如果函数式接口作为一个方法的参数&#xff0c;就以为着要方法调用方自己实现业务逻辑&#xff0c;常见的使用场景是一个业务整体逻辑是不相上下的&#xff0c;但是在某一个步骤有不同的逻辑&#xff0c;例如数据处理有不同的策略&#xff0c;如果有大量的if-els&#xff0c;或…...

全面详解Maven的配置文件settings.xml

全面详解Maven的配置文件settings.xml setting文件位置maven多仓库查找依赖的顺序大致如下&#xff1a;基本配置选项localRepository(本地仓库设置)mirrors(镜像设置)servers(服务器)Profiles(配置文件)Active Profiles(激活配置文件Profiles的Profile) Maven是一个用于构建和管…...

【Spring连载】使用Spring Data访问Redis(十四)----Redis Repositories

【Spring连载】使用Spring Data访问Redis&#xff08;十四&#xff09;----Redis Repositories 一、Core concepts二、Defining Repository Interfaces三、Creating Repository Instances四、Usage五、Object Mapping Fundamentals六、对象到Hash映射Object-to-Hash Mapping七、…...

小鹏汽车穿越“生死线”

文&#xff5c;刘俊宏编&#xff5c;王一粟 “颠覆与涅槃&#xff0c;颠覆自我与重新涅槃&#xff0c;让企业在变革中更完美的蜕变。” 2024新年伊始&#xff0c;小鹏汽车董事长兼CEO何小鹏对2023年的蜕变显然非常刻骨铭心。无论是在汽车新势力&#xff0c;还是放眼整个中国汽…...

AIPC专题:深耕笔电背光模组领域,AIPC与车载显示拉动公司成长

今天分享的是AIPC系列深度研究报告&#xff1a;《AIPC专题&#xff1a;深耕笔电背光模组领域&#xff0c;AIPC与车载显示拉动公司成长》。 &#xff08;报告出品方&#xff1a;东兴证券&#xff09; 报告共计&#xff1a;19页 公司深耕笔电背光模组&#xff0c;主要下游客户为…...

架构(十一)从0到1实现动态定时任务

一、引言 作者的平台项目最近需要实现一个功能&#xff0c;用户可选择这个任务什么时候执行&#xff0c;执行频率是什么&#xff1f; 这其实就是一个定时任务&#xff0c;只不过需要动态的&#xff0c;让用户自由选择。 二、原生实现 要实现这样的功能&#xff0c;可以直接依赖…...

Mybatis 批量插入数据 SQL

温故而知新&#xff0c;这里记录一下 案例1 批量插入时&#xff0c;xxxMapper.java 中方法的参数都必须是 List &#xff0c;泛型可以是 bean &#xff0c;也可以是 Map 。配合使用 mybatis 的 foreach 即可。示例如下&#xff1a; public Integer batchInsertDemo(List<D…...

【学员分享-考试心得】国产数据库潜力无限,云贝教育OBCP认证培训帮您解难题

近年来&#xff0c;随着国产化转型的推进&#xff0c;国外数据库的岗位需求逐渐减少&#xff0c;让许多IT从业者倍感压力。在这种情况下&#xff0c;了解国产数据库成为了求职市场上的竞争力。云贝老师们将聚焦于OceanBase、PostgreSQL、TDSQL等IT培训&#xff0c;探讨其对国产…...

【Mysql】事务的隔离级别与 MVCC

事务隔离级别 我们知道 MySQL 是一个 C/S 架构的服务&#xff0c;对于同一个服务器来说&#xff0c;可以有多个客户端与之连接&#xff0c;每个客户端与服务器连接上之后&#xff0c;就是一个会话&#xff08; Session &#xff09;。每个客户端都可以在自己的会话中向服务器发…...

MongoDB从入门到实战之MongoDB快速入门

前言 上一章节主要概述了MongoDB的优劣势、应用场景和发展史。这一章节将快速的概述一下MongoDB的基本概念&#xff0c;带领大家快速入门MongoDB这个文档型的NoSQL数据库。 MongoDB从入门到实战的相关教程 MongoDB从入门到实战之MongoDB简介&#x1f449; MongoDB从入门到实战…...

Linux服务详解

如有错误或有补充&#xff0c;以及任何改进的意见&#xff0c;请在评论区留下您的高见&#xff0c;同时文中给出大部分命令的示例&#xff0c;即是您暂时无法在Linux中查看&#xff0c;您也可以知道各种操作的功能以及输出 如果觉得本文写的不错&#xff0c;不妨点个赞&#x…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...