关于Spring事务及其传播机制

article/2025/9/21 0:46:03

目录

  • 一丶Spring中事务的实现

  • <1>事务的四大特性有哪些<2>数据库并发一致性问题以及隔离级别的设置2>隔离可以解决的并发问题<3>Spring事务隔离级别

  • <1>事务的传播机制是什么?为什么需要传播机制<2>事务的传播机制有哪些?<3>Spring事务传播机制使用和各种场景演示1>支持当前事务(REQUIRED)2>不支持当前事务(REQUIRES_NEW)3> 不支持当前事务,NEVER 抛异常4>NESTED 嵌套事务 + 嵌套事务和加入事务区别?

这部分,就是关于事务了。emmmm,前言也不知道说啥了,人有点麻了。

还是老规矩,红色标题是重点。

一丶Spring中事务的实现

<1>MySQL中的事务使用(回顾)

事务在MySQL 有 3 个重要的操作:开启事务、提交事务、回滚事务,它们对应的操作命令如下:

 
 

-- 开启事务 start transaction; -- 业务执行 -- 提交事务 commit; -- 回滚事务 rollback;

这样写可能有点空洞,那么我们按照实际来:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

<2>手动操作事务

当前这种方式我们了解一下就行,我们主要使用是自动操作事务

Spring 手动操作事务和上面 MySQL 操作事务类似,它也是有 3 个重要操作步骤:

1.开启事务(获取事务)。

2.提交事务。

3.回滚事务。

SpringBoot 内置了两个对象, DataSourceTransactionManager 用来获取事务(开启事务)、提交或

回滚事务的,而 TransactionDefinition 是事务的属性,在获取事务的时候需要将TransactionDefinition 传递进去从而获得一个事务 TransactionStatus,实现代码如下:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

<3>自动操作事务

声明式事务的实现很简单,只需要在需要的方法上添加 @Transactional 注解 就可以实现了,无需手动

开启事务和提交事务,进入方法时自动开启事务,方法执行完会自动提交事务,如果中途发生了没有处理的异常会自动回滚事务,具体实现代码如下:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

此时我传值是true,所以这里会抛出一个异常

编辑切换为居中

添加图片注释,不超过 140 字(可选)

然后看一看我们的SQL数据库,也可以看到值没有修改

编辑切换为居中

添加图片注释,不超过 140 字(可选)

然后我们不让这个异常执行,也就是传一个false

编辑切换为居中

添加图片注释,不超过 140 字(可选)

可以看到此时修改成功

编辑切换为居中

添加图片注释,不超过 140 字(可选)

当然,除了这种做法,还有一种做法:配置一个声明式的AOP代理,拦截符合规则的方法,就可以自动的使用事务。

1>作用域说明

 
 

@Transactional 可以用来修饰方法或类: 修饰方法时:需要注意只能应用到 public 方法上,否则不生效。推荐此种用法。 修饰类时:表明该注解对该类中所有的 public 方法都生效。

但是!这里注意了,极其不推荐对类进行使用

2>参数说明

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

3>@Transactional 工作原理

@Transactional 是基于 AOP 实现的,AOP 又是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理,如果目标对象没有实现了接口,会使用 CGLIB 动态代理。

@Transactional 在开始执行业务之前,通过代理先开启事务,在执行成功之后再提交事务。如果中途遇

到的异常,则回滚事务。

@Transactional 实现思路预览:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

@Transactional 具体执行细节如下图所示:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

二丶事务隔离级别

<1>事务的四大特性有哪些

事务有4 大特性(ACID),原子性、持久性、一致性和隔离性,具体概念如下:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面 4 个属性,可以简称为ACID。

原子性(Atomicity,或称不可分割性)

一致性(Consistency)

隔离性(Isolation,又称独立性)

持久性(Durability)。

而这 4 种特性中,只有隔离性(隔离级别)是可以设置的。

那为什么要设置事务的隔离级别呢?

设置事务的隔离级别是用来保障多个并发事务执行更可控,更符合操作者预期的。

什么是可控呢?

比如近几年比较严重的新冠病毒,我们会把直接接触到确证病例的人员隔离到酒店,而把间接接触者(和直接接触着但未确诊的人)隔离在自己的家中,也就是针对不同的人群,采取不同的隔离级别,这种隔离方式就和事务的隔离级别类似,都是采取某种行动让某个事件变的“更可控”。而事务的隔离级别就是为了防止,其他的事务影响当前事务执行的一种策略。

<2>数据库并发一致性问题以及隔离级别的设置

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

注意一下,我这里是部分解决,不是全部解决。

1>隔离级别的解读

编辑切换为居中

添加图片注释,不超过 140 字(可选)

2>隔离可以解决的并发问题

编辑切换为居中

添加图片注释,不超过 140 字(可选)

<3>Spring事务隔离级别

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这个我们之后具体实践的时候再细细讲

但是这里不妨碍我们先体现提一下

编辑切换为居中

添加图片注释,不超过 140 字(可选)

三丶事务的传播机制

<1>事务的传播机制是什么?为什么需要传播机制

Spring 事务传播机制定义了多个包含了事务的方法,相互调用时,事务是如何在这些方法间进行传递

的。

事务隔离级别是保证多个并发事务执行的可控性的(稳定性的),而事务传播机制是保证一个事务在多

个调用方法间的可控性的(稳定性的)。

<2>事务的传播机制有哪些?

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

<3>Spring事务传播机制使用和各种场景演示

1>支持当前事务(REQUIRED)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这里可以看到我没有加注释,为什么呢?

因为REQUIRED是默认的隔离级别,如果也就是我们级别设置当中的

编辑

添加图片注释,不超过 140 字(可选)

2>不支持当前事务(REQUIRES_NEW)

看我下面的代码演示,就是修改了一个权限级别

编辑切换为居中

添加图片注释,不超过 140 字(可选)

然后发起请求,重新访问

编辑切换为居中

添加图片注释,不超过 140 字(可选)

先看一下执行结果

编辑切换为居中

添加图片注释,不超过 140 字(可选)

可以发现其实没有修改成功,为什么呢?看我们的执行流程

编辑切换为居中

添加图片注释,不超过 140 字(可选)

然后学的时候,我觉得我自己在这里的问题描述不是很清楚,所以我重新描述一下问题就应该能理解清楚了

编辑

添加图片注释,不超过 140 字(可选)

那么我们换种写法,把事务的开启挪一个地方

编辑切换为居中

添加图片注释,不超过 140 字(可选)

然后此时我们查看是否修改成功

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这会又可以修改成功了,我们来看日志分析一下

编辑切换为居中

添加图片注释,不超过 140 字(可选)

3> 不支持当前事务,NEVER 抛异常

这个演示就很直接了,直接给你报错

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

4>NESTED 嵌套事务 + 嵌套事务和加入事务区别?

看我如下的代码演示,这个和上面的是有区别的熬,我这里两个方法同时给了嵌套注释,这是加入事务的演示

编辑切换为居中

添加图片注释,不超过 140 字(可选)

此时你可以看到,虽然说我都给了嵌套注释,但是这里其实和我上面的加入事务区别不是很大,为什么呢?往下走,继续往下看

编辑切换为居中

添加图片注释,不超过 140 字(可选)

此时数据库没有被修改,那么我们看看执行流程

编辑切换为居中

添加图片注释,不超过 140 字(可选)

是不是有点迷??没关系,我换种方式再演示一下,看看区别

这里我们设置回滚点

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

可以发现,很神奇的修改成功了

编辑切换为居中

添加图片注释,不超过 140 字(可选)

那么我们再来分析分析执行流程

编辑切换为居中

添加图片注释,不超过 140 字(可选)

现在是不是差不多看明白了?那么来语言总结一下

 
 

嵌套事务只所以能够实现部分事务的回滚,是因为事务中有一个保存点(savepoint)的概念,嵌套事务 进入之后相当于新建了一个保存点,而滚回时只回滚到当前保存点,因此之前的事务是不受影响的 而 REQUIRED 是加入到当前事务中,并没有创建事务的保存点,因此出现了回滚就是整个事务回滚,这 就是嵌套事务和加入事务的区别

所以

嵌套事务(NESTED)和加入事务(REQUIRED )的区别:

1.整个事务如果全部执行成功,二者的结果是一样的。

2.如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部回滚,不会影

响上一个方法中执行的结果。

            资源获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻

 精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻

每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待


http://chatgpt.dhexx.cn/article/67RN27Sq.shtml

相关文章

Spring事务传播机制--包含用例解释

Spring事务传播机制 一、何为Spring传播机制&#xff1a; Spring事务的传播机制就是&#xff0c;事务如何在方法的调用如何传播。 二、使用传播机制的时候的关键点&#xff1a; 使用声明式的事务时&#xff0c;调用方法和被调用方法不能在同一个类。比如同在一个service方法…

spring事务传播机制实例讲解

对于SQL事务的概念以及ACID性质&#xff0c;可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011spring的管理的事务可以分为如下2类&#xff1a; 逻辑事务 在spring中定义的事务通常指逻辑事务&#xff0c;提供比物理事务更抽象&#xff0c;方便的事务配置管…

Spring事务及事务传播机制

一.事务的含义:多个操作封装在一起&#xff0c;要么同时执行成功&#xff0c;一旦有一个操作执行失败&#xff0c;那么全部执行失败。这里给大家举个例子:比如A给B转账50元&#xff0c;而B没有收到这50元&#xff0c;此时A转账B这个操作也需要进行回滚&#xff0c;恢复到A给B没…

【 Spring 事务传播机制 】

文章目录 一、概念二、为什么需要事务传播机制&#xff1f;三、事务传播机制有哪些&#xff1f;四、Spring 事务传播机制使⽤和各种场景演示4.1 ⽀持当前事务&#xff08;REQUIRED&#xff09;4.2 不⽀持当前事务&#xff08;REQUIRES_NEW&#xff09;4.3 NESTED 嵌套事务4.4 嵌…

Spring事务与事务传播机制

目录 1.事务的基本概念 2.Spring事务的实现 3.事务隔离级别 4.事务传播机制 1.事务的基本概念 关于事务的一些基础概念我已经在MYSQL中讲解过了&#xff0c;有不了解的可以移步至此篇文章&#xff1a;MySQL基础——数据库索引与事务_invictusQAQ的博客-CSDN博客 2.Spring…

Spring事务、事务隔离级别、事务传播机制

Spring事务、事务隔离级别、事务传播机制 一、为什么需要事务&#xff1f;(回顾)二、Spring中事务的实现2.1 MySQL中的事务使用 (回顾)2.2 Spring编程式事务2.3 Spring 声明式事务2.3.1 Transactional 使用2.3.2 Transactional 作用范围2.3.3 Transactional 参数说明2.3.4 注意…

Spring 事务和事务的传播机制

1.Spring 中事务的实现方式 Spring 中的操作主要分为两类: 编程式事务 (了解) 声明式事务 编程式事务就是手写代码操作事务, 而声明式事务是利用注解来自动开启和提交事务. 并且编程式事务用几乎不怎么用. 这就好比汽车的手动挡和自动挡, 如果有足够的的钱, 大部分人应该都会选…

【Spring Boot】事务和事务传播机制

文章目录 1. 事务简单介绍2. Spring 中事务的实现2.1 Spring 手动操作事务2.2 Spring 声明式事务 3. Transactional 注解介绍3.1 Transactional 作用范围3.2 Transactional 参数说明3.3 Transactional 出现异常注意事项3.4 Transactional 工作原理 4. 事务隔离级别4.1 事务特性…

SpringBoot事务传播机制

Spring的事务传播机制:是指规定当程序中出现了多个方法出现了嵌套调用的时候&#xff0c;事务是如何进行传递的 支持当前事务:要有房子的 不支持当前事务:不许要有房子的 嵌套事务 1)定义:咱们之前所说的事务&#xff0c;都是针对一个方法的&#xff0c;咱们的Spring事务传播机…

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

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

Spring中的事务传播机制

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

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

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

事务传播行为

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

[事务] 事务的传播机制

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

事物的传播机制

目录 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 事务传播机制&#xff1a;就是事务在多个方法的调用中是如何…

Spring事务传播机制

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

Spring事务传播的7种机制

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

事务的传播机制

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

Spring事务传播机制详解

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

反射原理详谈

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