Spring事务传播机制

hi ,大家好,继续为大家带来Spring事务传播机制的相关知识
在这里插入图片描述

文章目录

  • 🤗1.事务传播机制是什么
  • 🤗2.事务传播机制作用
  • 🤗3.事务传播机制

🤗1.事务传播机制是什么

定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些⽅法间进⾏传递的

🤗2.事务传播机制作用

事务隔离级别是保证多个并发事务执⾏的可控性的(稳定性的),而事务传播机制是保证⼀个事务在多个调用方法间的可控性的(稳定性的)
在这里插入图片描述上面的图片很好的解释了事务传播机制和事务隔离级别的流程

🤗3.事务传播机制

Spring事务传播机制定义了在多个事务方法相互调用时,不同事务方法间事务处理的行为方式。Spring框架提供了7种不同的事务传播行为方式,分别是:

  1. REQUIRED:默认的传播行为,如果当前存在事务,则加入该事务,否则创建一个新事务。
    在这里插入图片描述
    这个来通俗的解释一下,如果当前方法没有开启事务,就会创建一个新的事务,如果存在事务就会加入该事务
    在这里插入图片描述
    我们在用代码验证一下
    在这里插入图片描述
    在这里插入图片描述
    因为此时的级别默认是required,所以应该是一个大事务,有一个有异常 ,其余的也就添加失败
    在这里插入图片描述

在这里插入图片描述
可以从数据库中看到,并未添加数据

  1. SUPPORTS:如果当前存在事务,则加入该事务,否则不使用事务。
    在这里插入图片描述
    如果A 没有开启事务,那么就以非事务的方式运行,后面的方法看到该调用链没有事务就也会摆烂,因此即使报了异常,也继续添加,
    看代码
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
3 MANDATORY:当前方法必须在事务中执行,存在事务,就会加入该事务,如果不存在事务,则抛出异常。

4.REQUIRES_NEW:表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。

5.NOT_SUPPORTED:以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起

6.NEVER:当前方法不能在事务中执行,如果存在事务,则抛出异常。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以清楚的看到没有插入
在这里插入图片描述
控制台连受影响的行数都没有打印,直接抛出异常

这个NESTED比较绕😭,我们一起努力,冲冲冲!😜

7.NESTED:创建一个嵌套事务,如果当前存在事务,则将该事务作为嵌套事务的父事务,如果父事务提交,则嵌套事务会提交,否则回滚。
如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。
执行流程
在这里插入图片描述

当没有事务,创建事务,后续方法会生成嵌套事务,并且有一个保存点,一旦该事务出现问题,就会回滚到上一个事务保存点,不会影响其他事务的执行

package com.example.demo.controller;import com.example.demo.model.Userinfo;
import com.example.demo.service.UserService;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.pattern.PathPattern;//测试类@RestController@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/add")@Transactional(propagation = Propagation.REQUIRED)public  int  add(){Userinfo userinfo=new Userinfo();userinfo.setUsername("老七");userinfo.setPassword("123");int result=    userService.add(userinfo);System.out.println("受影响的行数是"+result);userService.insert(userinfo);return result;}
}
package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import com.example.demo.model.Userinfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactional(propagation = Propagation.NESTED)public int  add(Userinfo userinfo){int result=userMapper.add(userinfo);System.out.println("受影响的行数"+result);return  result;}@Transactional(propagation = Propagation.NESTED)public int insert(Userinfo userinfo){int result=userMapper.add(userinfo);System.out.println("受影响的行数"+result);int num=10/0;return  result;}
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
数据库是啥也没插入的,为啥呢?不是说会回滚到上一个事务保存点吗?所以应该插入一条,为啥一条也没有
因为:在这里插入图片描述
第三个出了问题,那么创建事务的作为调用方,一定可以感知到异常,那么整个事务就会回滚,所以一条都不会插入
所以某个方法报异常不要让总的调用者感知到,就不会全部回滚,那么可以采用如下方式
在这里插入图片描述
修改这里的代码,让该方法感知到异常即可,不让总方法感知到,那么就会执行回滚操作,回滚到上一个事务保存点,所以只会插入一条数据

在这里插入图片描述
在写这个例子的时候,我们特意修改,不在add方法里面调用insert方法,而是在userController中调用,为什么呢?
🤗🤗🤗因为NESTED嵌套NESTED的时候,上一个NESTED保存点设置不上,这两个保存点会进行合并,合并成一个临时任务,那么一个挂掉,两个都挂了,所以在总的调用方法中调用它,才能有效果
再举一个例子:

公司雇了一个清洁工A,清洁工自己有又雇了一个清洁工B,当清洁B干了坏事,那么公司就会把A和B同时开除,当公司雇了两个清洁工,其中一个清洁工出了问题,就开掉出问题的那个就好,没出问题的留下~

这个例子就对应了代码的执行过程~

今天就讲到这里,我们下期再见,886!
在这里插入图片描述

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

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

相关文章

[C++ 网络协议编程] UDP协议

目录 1. UDP和TCP的区别 2. UDP的工作原理 3. UDP存在数据边界 4. UDP的I/O函数 4.1 sendto函数 4.2 recvfrom函数 4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服务器端通信流程 5.2 客户端通信流程 1. UDP和TCP的区别 主要…

【深度学习】日常笔记16

可以将pd.DataFrame数据结构理解为类似于Excel中的表格。pd.DataFrame是pandas库提供的一个二维数据结构,用于存储和操作具有行和列的数据。它类似于Excel中的工作表,其中每一列可以是不同的数据类型(例如整数、浮点数、字符串等)…

关于安卓打包生成aar,jar实现(一)

关于安卓打包生成aar,jar方式 背景 在开发的过程中,主项目引入三方功能的方式有很多,主要是以下几个方面: (1)直接引入源代码module(优点:方便修改源码,易于维护&#…

Spring_AOP

一、AOP简介 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程0OP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象…

Vue 安装开发者工具

1.下载开发者工具,下载地址:http://book.wiyp.top/App/Vue3开发者工具-谷歌/Vue3.crx 2.打开谷歌浏览器,点击扩展,点击管理扩展程序。 3.开启开发者模式,将 Vue3 开发者工具文件拖拽到浏览器中进行安装。 注&#xff…

chatGPT小白快速入门培训课程-001

一、前言 本文是《chatGPT小白快速入门培训课程》的第001篇文章,全部内容采用chatGPT和chatGPT开源平替软件生成。完整内容大纲详见:《chatGPT小白快速入门课程大纲》。 本系列文章,参与: AIGC征文活动 #AIGC技术创作内容征文# …

使用pymupdf实现PDF内容搜索并显示功能

简介: 在日常工作和学习中,我们可能需要查找和提取PDF文件中的特定内容。本文将介绍如何使用Python编程语言和wxPython图形用户界面库来实现一个简单的PDF内容搜索工具。我们将使用PyMuPDF模块来处理PDF文件,并结合wxPython构建一个用户友好的…

虹科方案 | 汽车总线协议转换解决方案(二)

上期说到,虹科的PCAN-LIN网关在CAN、LIN总线转换方面有显著的作用,尤其是为BMS电池通信的测试提供了优秀的解决方案。假如您感兴趣,可以点击文末相关链接进行回顾! 而今天,虹科将继续给大家带来Router系列在各个领域的…

elasticsearch 基础

ES 搜索技术历史 今天看的是《Elasticsearch实战与原理解析》 第一章 搜索技术发展史 1、搜索技术发展史 宏观而言,搜索引擎的发展经历了五个尖端和两大分类。五个阶段分别是ftp文件检索阶段、分类目录阶段、文本相关性检索阶段、网页链接分析阶段和用户意图识别…

【Pytorch:nn.Embedding】简介以及使用方法:用于生成固定数量的具有指定维度的嵌入向量embedding vector

文章目录 1、nn.Embedding2、使用场景 1、nn.Embedding 首先我们讲解一下关于嵌入向量embedding vector的概念 1)在自然语言处理NLP领域,是将单词、短语或其他文本单位映射到一个固定长度的实数向量空间中。嵌入向量具有较低的维度,通常在几…

[Mongodb 5.0]单机启动

安装完mongodb后,会自动生成下面两个目录(mongod.conf中设定的),用来存放日志和数据 /var/lib/mongo (数据目录) /var/log/mongodb (日志目录) 要启动一个单机版的mongodb,一般有两种方式: 第一种启动方式:直接使用…

第5章:神经网络

神经元模型 上述定义的简单单元即为神经元模型。 多层网络 误差逆传播算法 标准BP算法:参数更新非常频繁,可能出现抵消现象。积累BP算法:下降到一定程度上,进行下一步会非常缓慢。 过拟合 早停:划分训练集和验证集…

vue3+ts使用antv/x6

使用 2.x 版本 x6.antv 新官网: 安装 npm install antv/x6 //"antv/x6": "^2.1.6",项目结构 1、初始化画布 index.vue <template><div id"container"></div> </template><script setup langts> import { onM…

redis — 基于Spring Boot实现redis延迟队列

1. 业务场景 延时队列场景在我们日常业务开发中经常遇到&#xff0c;它是一种特殊类型的消息队列&#xff0c;它允许把消息发送到队列中&#xff0c;但不立即投递给消费者&#xff0c;而是在一定时间后再将消息投递给消费者。延迟队列的常见使用场景有以下几种&#xff1a; 在…

HoudiniVex笔记_P23_SDFBasics有向距离场

原视频&#xff1a;https://www.youtube.com/playlist?listPLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI Bili&#xff1a;Houdini最强VEX算法教程 - VEX for Algorithmic Design_哔哩哔哩_bilibili Houdini版本&#xff1a;19.5 1、什么是SDF Houdini支持两种体积类型&#xff0c;…

使用wxPython和PyMuPDF提取PDF页面指定页数的内容的应用程序

在本篇博客中&#xff0c;我们将探讨如何使用wxPython和PyMuPDF库创建一个简单的Bokeh应用程序&#xff0c;用于选择PDF文件并提取指定页面的内容&#xff0c;并将提取的内容显示在文本框中。 C:\pythoncode\new\pdfgetcontent.py 准备工作 首先&#xff0c;确保你已经安装了…

大数据-玩转数据-Flink网页埋点PV统计

一、说明 衡量网站流量一个最简单的指标&#xff0c;就是网站的页面浏览量&#xff08;Page View&#xff0c;PV&#xff09;。用户每次打开一个页面便记录1次PV&#xff0c;多次打开同一页面则浏览量累计。 一般来说&#xff0c;PV与来访者的数量成正比&#xff0c;但是PV并不…

虹科干货 | 化身向量数据库的Redis Enterprise——快速、准确、高效的非结构化数据解决方案!

用户期望在他们遇到的每一个应用程序和网站都有搜索功能。然而&#xff0c;超过80%的商业数据是非结构化的&#xff0c;以文本、图像、音频、视频或其他格式存储。Redis Enterprise如何实现矢量相似性搜索呢&#xff1f;答案是&#xff0c;将AI驱动的搜索功能集成到Redis Enter…

STABLE DIFFUSION模型及插件的存放路径

记录下学习SD的一些心得&#xff0c;使用的是秋叶大佬的集成webui&#xff0c;下载了之后点击启动器即可开启&#xff0c;文件夹中的内容如下 主模型存放在models文件下的stable-diffusion文件夹内&#xff0c;一些扩展类的插件是存放在extensions文件夹下

【设计模式】责任链模式

顾名思义&#xff0c;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中&#xff0c;通常每个接收者…