SpringBoot事务传播机制

article/2025/9/21 2:07:09

Spring的事务传播机制:是指规定当程序中出现了多个方法出现了嵌套调用的时候,事务是如何进行传递的

支持当前事务:要有房子的

不支持当前事务:不许要有房子的

嵌套事务 

1)定义:咱们之前所说的事务,都是针对一个方法的,咱们的Spring事务传播机制,不再是单个的事务了,咱们的Spring事务传播机制定义了包含多个事务的方法相互调用的时候,事务是如何在这些方法中进行传递的;

Spring中多个事务在进行相互调用的时候,它们之间的行为模式是啥样的?

2)比如说A方法加了事务,B方法加了事务,C方法还是加了事务,那咱们的事务是如何进行传递的呢?咱们的A方法里面调用了B方法和C方法,咱们的C方法有异常,AB方法是没有异常的,那我们应该怎们办呢?咱们要进行全局的回滚?那个需要进行回滚呢?

 事务传播机制主要是在一个竖形传播链上面的,一个事务去调用另一个事务,另一个事务又调用了一个事务,那么这个事务如何去执行?如何传递?行为模式是什么样子的?

咱们的事务隔离级别是保证多个并发事务执行的一个可控性的(稳定性),而事务传播机制是保证一个事务在多个调用方法之间的一个可控性的,为什么需要事务的传播机制?这就和为什么需要事务是一样的,就是为了保证程序的稳定性,为了符合我们的一个程序运行预期;

3)事务的传播机制,就是在多个事务进行相互调用的时候,能进行行为控制,能够达到我们预期的效果

4)MYSQL的事务是没有很复杂的,事务只是单纯的在做一件事情,但是事务传播机制,当整个调用链上,有一个程序里面有多个方法的时候,然后,多个方法相互调用的时候,并且这多个方法,都具有事务的时候,这个情况,就是 事务嵌套的问题。
也就是说当程序中出现嵌套事务之后,那么,这些嵌套事务之间的行为模式就是传播机制;

5)隔离性,针对的是不存在事务嵌套 的 前提下。
传播机制,针对是 存在 事务嵌套 的前提下。
从出发点来看,它们就不一样;

隔离性多个事务并发执行,但不会存在嵌套事务的问题,就好像每个人都在自己的跑道上奔跑,互不干扰。

传播机制在一个调用链上,多个方法里面有多个事务,而这多个事务在相互调用的时候 ,使用的行为模式。

传播机制就是:
多个事务都在 “ 一条线上 ” ,然后,以什么样的行为(方式)去进行事务传播(调用事务)

事务的隔离性:
多个事务不在 “ 一条线上 ” 的,走着各自的路线,互不影响

Spring中事务挂起的含义是,需要新事务时
将现有的connection1保存起来(它还有尚未提交的事务)
然后创建connection2,connection2提交、回滚、关闭完毕后
再把connection1取出来,完成提交、回滚、关闭等动作
保存connection1的动作称之为事务挂起。

Spring的事务传播机制:

Propagation的意思就是传播

1)Propagation.REQUIRED:必须的,是一个默认的传播机制,它表示如果当前存在事务,那么就直接加入到事务里面,如果当前没有事务,就进行创建一个新的事务,如果调用链上面有一个出现了问题,那么就全部进行回滚;

类似于说女朋友买房,男朋友有房子女朋友就住进去,男朋友没房子,男朋友和女朋友一起挣钱买,反正最终一定要有房子,最终两个人一定都要住到一个房子里面

2)Propagation.SUPPORTS:如果说当前存在事务,那么直接加入到该事务,如果当前没有事务,则以⾮事务的⽅式继续运⾏;

如果男朋友有房子,那么就直接住进去,如果男朋友没有房子也没关系,女朋友自己租房子也行;

3)Propagation.MANDATORY:(mandatory中文是强制性)比如说A方法调用B方法的时候,我们的两个方法必须都要有事务,我们就将他们合成一个新的事务,反之就会抛出异常,如果当前存在事务,那么就加入到该事务,如果当前没有事务,那么直接抛出异常;

如果男朋友有房子好说,直接住进去,如果男朋友没房子,直接闹掰,直接分手,直接崩了

上面的情况都是支持当前事务的,也就是说如果当前存在事务,那么上面三种的运行结果都是一样的,如果不存在事务,那么运行结果就会不相同;

4)Progagation.REQUIRES_NEW:表示创建一个新的事务,如果说当前存在事务,则会把当前事务进行挂起,也就是说无论外部方法是否开启事务,Progagation.REQUIRES_NEW修饰的内部方法会开启自己的事务,况且开启的事务之间会相互独立,互不干扰,各个方法之间的事务是相互独立的,是互不干扰的,不会进行全局的事务回滚,自己回滚自己的;

女朋友不管男朋友在西安有没有房子,你有房子我也不住,我必须要买一个单独新的房子,女朋友自己单独开启一个新的事务;

5)Propagation.NEVER:表示如果调用链上面的任意一个方法出现了事务,那么就会直接抛出异常

就是你男朋友有房子,还要还房贷,直接分手,没房子非常好,不想住房子,就想住大街;

6) Propagation.NOT_SUPPORTED
⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起,不会以事务的方式运行

不管男朋友有没有卖房子,女朋友自己都要租房子,就是以非事务的方式来运行;

上面三种是不支持当前事务,不管有没有房子都不住;

7)Propagation.NESTED
如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏;
如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED,创建一个新事务;

加入事务和嵌套事务的区别: 

1)如果整个调用链上面的事务全部执行成功了,那么两者的最终结果是相同的

2)如果说事务执行到一半失败了,那么加入事务会将整个事务全部进行回滚,而我们的嵌套事务会进行局部回滚,不会影响到上一个方法中执行的结果,不会影响之前的事务执行的

对于嵌套事务来说,之所以嵌套事务可以实现部分事务的回滚,是因为事务中有一个保存点的概念,嵌套事务进入之后相当于是新建了一个保存点,而回滚的时候可以回滚到保存点,每一个事务执行完成之后都会有一个保存点,因此之前的事务是不会受影响的,相当于是临时工,一旦临时工出问题,直接开除,不影响原有的事务,嵌套事务是一个外部事务的一个子事务,是一个外部事务的一个组成部分,当嵌套事务发生异常,而回滚,则会回复到嵌套事务的执行前的状态;

加入事务,整个事务都会回滚,是会影响原来的事务的,加入事务没有设置保存点;

事务的隔离级别和事务的传播机制:

1)事务的隔离级别描述的是多个事务同时执行时候的某一种行为,是事务四大特性中的隔离性的一种特殊体现,使用事务的隔离级别可以进行控制并发事务同时执行的某种行为,也就是说多个事务共同操作数据库

2)事务的隔离级别指的是纵向事务并发调用的行为模式

3)而事务的传播机制指的是横向事务传递的时候的行为模式,包含了多个事务相互调用的时候事务的传播行为

过滤器:设置字符编码,防盗链

我们使用过滤器使用的是Servlet3.0提供的@WebFilter注解,配置过滤的url规则,然后在实现@WebFilter接口,重写里面的doFilter方法:

package com.example.demo;import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/Java100")
@Component
public class Configuration implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("执行过滤器前置方法");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("开始执行过滤器");filterChain.doFilter(servletRequest,servletResponse);System.out.println("执行完过滤器");}@Overridepublic void destroy() {System.out.println("执行过滤器后置方法");}
}

1)void init()这个是Spring容器启动的时候会被调用,整个程序运行期间只会调用一次,用于实现Filter的初始化

2)在doFilter方法执行具体的流程

3)我们在destory完成Filter销毁之前完成的工作

package com.example.demo;import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter(urlPatterns = "/Java100")
@Component
public class Configuration implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("执行过滤器前置方法");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request=(HttpServletRequest)servletRequest;HttpServletResponse response=(HttpServletResponse)servletResponse;HttpSession httpSession= request.getSession();if(httpSession==null){filterChain.doFilter(servletRequest,servletResponse);}else{response.sendRedirect("http://www.baidu.com");}}@Overridepublic void destroy() {System.out.println("执行过滤器后置方法");}
}

拦截器和过滤器的区别

1)出身不同:过滤器是来源于Servlet,通过这个过滤器是导入Servlet相关的jar包,但是拦截器是来源于Spring框架,导入拦截器是导入的是有关于Spring相关的包

2)触发时机不同:请求进入容器>进入过滤器>进入到Servlet>进入到拦截器>执行控制器,也就是说过滤器会先执行,然后才会执行拦截器,最后才会执行真正调用的方法

3)过滤器是通过方法回调实现的,但是拦截器是通过动态代理来进行实现的

4)过滤器必须在Web项目中进行使用,但是拦截器可以应用于任何项目

5)拦截器通常使用作于业务逻辑的的判断,但是过滤器通常用于字符编码设置,字符集设置


http://chatgpt.dhexx.cn/article/BsaZtn5j.shtml

相关文章

Spring的事务传播机制(通俗易懂)

概述 Spring的事务传播机制有7种,在枚举Propagation中有定义。 1.REQUIRED PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的默认设置。 Tra…

Spring中的事务传播机制

目录 前言 1、Spring(Spring Boot)实现事务 1.1、通过代码的方式手动实现事务 1.2、通过注解Transactional的方式实现声明式事务 1.2.1、实现: 1.2.2、程序中有try-catch时,程序发生异常事务不会回滚 解决方案一:将异常抛出去 …

事务的7种传播机制和演示

文章目录 一、事务的传播机制1.1、nested 事务的几点说明: 二、示例2.1、前言:2.2、准备测试方法1)创建beans.xml,开启事务2)创建实体类和表(表创建读者可自定义创建)3)创建service接…

事务传播行为

原文作者:https://blog.csdn.net/soonfly/article/details/70305683 事务传播行为 什么叫事务传播行为?听起来挺高端的,其实很简单。 即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。 事务传…

[事务] 事务的传播机制

前言: Spring的事务,也就是数据库的事务操作,符合ACID标准,也具有标准的事务隔离级别。 但是Spring事务有自己的特点,也就是事务传播机制。 所谓事务传播机制,也就是在事务在多个方法的调用中是如何传递的&…

事物的传播机制

目录 1、事务的传播机制 2、测试 2.1、准备测试方法 2.2、事务传播机制的测试 2.2.1、REQUIRED 2.2.2、NOT_SUPPORTED 2.2.3、REQUIRES_NEW 2.2.4、MANDATORY 2.2.5、NEVER 2.2.6、SUPPORTS 2.2.7、NESTED 事务传播机制:就是事务在多个方法的调用中是如何…

Spring事务传播机制

目录 一、事务在Spring中是如何运作的 1.1 开启事务(DataSourceTransactionManager.doBegin) 二、Spring的事务传播机制 2.1 子事务的传播机制为REQUIRED 2.2 子事务的传播机制为REQUIRES_NEW 2.3 子事务的传播机制为NESTED 当我们在使用Spring所提供的事务功能时&#x…

Spring事务传播的7种机制

Spring 事务传播机制包含以下 7 种: 1. Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果 当前没有事务,则创建一个新的事务。 2. Propagation.SUPPORTS:如果…

事务的传播机制

目录 1.形象说明: 2.代码演示: 2.1 REQUIRED 2.1.1 验证共用一个事务 2.1.2 验证当前没有事务,就新建一个事务 2.2 SUPPORTS 2.2.1 支持使用当前事务 2.2.2 如果当前事务不存在,则不使用事务 2.3 MANDATORY 2.3.1 支持…

Spring事务传播机制详解

前言: Spring的事务,也就是数据库的事务操作,符合ACID标准,也具有标准的事务隔离级别。 但是Spring事务有自己的特点,也就是事务传播机制。 所谓事务传播机制,也就是在事务在多个方法的调用中是如何传递的&…

反射原理详谈

什么是反射? 反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言…

Java反射的作用与原理

Java反射的作用与原理 定义 反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。在Java中,只要给定类…

彻底搞懂java反射技术及其原理

概述:反射是java中最强大的技术之一,很多高级框架都用到了反射技术,面试中也是经常问的点,所以搞懂反射非常重要! 文章目录 1.反射是什么?2.反射的底层原理3.三种方式获取Class对象4.反射的优缺点5.反射的应用场景6.反射的常用API 1.反射是什么? java反射机制指…

java反射原理-重要

一,反射是什么(反射是框架设计的灵魂) 1,JAVA反射机制是在运行状态中 对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; …

java 反射机制原理 简述

什么是反射机制? 1、在运行状态中,对于任意一个类,都能够知道这个类的属性和方法。 2、对于任意一个对象,都能够调用它的任何方法和属性。这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。 反射的作用 1、在运行…

java反射如何实现的_Java反射实现原理

Java反射应用十分广泛,例如spring的核心功能控制反转IOC就是通过反射来实现的,本文主要研究一下发射方法调用的实现方式和反射对性能的影响。 如下为Method类中invoke方法,可以看出该方法实际是将反射方法的调用委派给MethodAccessor&#xf…

Java反射原理与使用

当类加载器将类加载进jvm之后,jvm会创建每一个类的元数据对象(Class),这个元数据对象(Class)记录着这类的所有信息,java语言允许通过元数据对象动态的创建对象实例,这种机制就称为java的反射机制,基本上所有框架的底层都用到了反射机制,spring、mybatis、servlet都用到了 1.如…

Java反射原理简析

Java的反射机制允许我们动态的调用某个对象的方法/构造函数,获取某个对象的属性等,而无需在编码时确定调用的对象。这种机制在我们常用的框架中也非常常见。 1.原理简介 类actionClass Class.forName(“ MyClass”); 对象actio…

java反射原理

一、反射机制 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态(在运行时)获取类的信息以及动态调用对象的方法的功能称为java语言的反射机制。简单来说,就是Java对每一个类和类中的所有成…

Java反射(原理剖析与使用)

一、反射机制是什么 1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。 2、Java属于先编译再运行的语言&a…