Spring事务和事务传播机制

article/2025/9/21 0:45:41

Spring事务和事务传播机制

  • 1.事务的定义
  • 2.Spring中的事务实现
  • 3.Spring声明式事务(自动事务)
  • 4.事务特性
  • 5.事务隔离级别
  • 6.举例说明事务的读未提交---脏读
  • 7.举例说明事务读已提交---不可重复读
  • 8.举例说明事务可重复读---幻读
  • 9.Spring事务传播机制
  • 10.事务传播机制--propagation.required 支持当前事务
    • 11.事务传播机制--不支持当前事务-(propagation.never)
    • 12.事务的传播机制--不支持当前事务(propagation.requires_new)

1.事务的定义

将一组操作封装成一个执行单元,要么全部成功,要么全部失败。

2.Spring中的事务实现

Spring中的事务操作分为两类:
1.手动操作事务;
2.声明式自动提交事务.

3.Spring声明式事务(自动事务)

声明式事务的实现很简单,在方法上添加@Transactional注解就可以实现了,无需手动开启事务和提交事务,进入方法时自动开启事务,方法执行完会自动提交事务,如果重土发生了没有处理的异常就会自动回滚事务。
举例说明:在方法上面添加@Transactional之后,就开启了事务,当往数据库进行添加操作的时候,int num=10/0,添加功能不会完成。
如果没有添加@Transactional注解,运行到int num=10/0的时候,虽然会报错,但是往数据库添加内容的操作可以完成。在这里插入图片描述>无论是否加注解@Transactional,当执行int num=10/0的时候,都会报错。
在这里插入图片描述

try catch导致事务失效,
针对事务失效有以下的解决方式:
(1)将catch的异常抛出去---------throw e

在这里插入图片描述

2.在catch使用代码手动进行事务的回滚操作

在这里插入图片描述

4.事务特性

1.事务有四大特性:原子性、持久性、一致性、隔离性。
a)原子性:一个事务中的所有操作,要么全部完成,要么全部不完成。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
b)一致性:在事务开始之前和事务结束之后,数据库的完整性没有被破坏。
c)持久性:事务处理结束后,对数据的修改是永久的,即便系统故障也不会丢失。
d)隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行由于交叉执行而导致数据的不一致。
2.事务隔离分为不同级别:包括读未提交、读提交、可重复读、和串行化

5.事务隔离级别

1.为什么要设置事务的隔离级别?

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

2.查看数据库的全局事务隔离级别和客户端事务隔离级别。

select @@global.tx_isolation,@@tx_isolation
在这里插入图片描述
更改事务隔离级别
set session transaction isolation level read committed在这里插入图片描述
再次查看数据库的全局事务隔离级别和客户端事务隔离级别。
发现,客户端事务隔离级别由repeatable-red变成了read-committed。
在这里插入图片描述

3.MySQL事务隔离级别由四种:

1.read uncommitted:读未提交,该隔离级别的事务可以看到其他事务未提交的数据,该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此,将该级别读到的数据称为脏数据(脏读)
2.read committed:读已提交,该隔离级别的事务可以读取到已经提交到的数据,因此不会有脏读的问题,由于在事务的执行中可以读取到其他事务提交的结果,在不同时间的相同的SQL查询中,可能会得到不同的结果,这种现象叫做不可重复读。
3.repeatable read:可重复读,是MySQL的默认事务级别,它能确保同一事务多次查询的结果一致,但是,也会有新的问题,比如,此级别的事务正在执行时,另一个事务成功的插入了某条数据,但是因为它每次查询的结果都是一样的,所以,会导致查询不到这条数据,自己重复插入的时候又失败。在事务中查询不到这条信息,但是自己就是插入数据失败,这种情况叫做幻读。
4.serializable:序列化,事务最高隔离级别,他会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,因为执行效率比较低,真正使用的场景不多。

4.Spring事务隔离级别有五种:

除了MySQL的四种事务隔离级别之外,
Spring事务隔离级别有一种:isolation.DEFAULT:以连接的数据库的事务隔离级别为主。

5.总结

MySQL中有4种事务隔离级别:
1.读未提交(存在脏读/不可重复读/幻读的问题);
2.读已提交(存在不可重复读/幻读问题);
3.可重复读(存在幻读的问题)可重复读是MySQL默认的事务隔离级别;
4.序列化;
5.脏读是读到了其他事务未提交的数据;
6.不可重复读是读到了其他事务修改的数据;
7.幻读是读取到其他事务新增或删除的“幻象”数据。

6.举例说明事务的读未提交—脏读

1.首先将数据库的隔离级别由原本默认的repeatable read 改成read uncommitted
在这里插入图片描述
在这里插入图片描述
2.创建数据库city,并且创建数据表city
在这里插入图片描述
在这里插入图片描述
3.再重新开一个mysql,然后,开启事务,往city表中添加数据,然后第一个mysql窗口查数据表中的信息,此时是可以读取到数据表中的信息,第二个mysql窗口针对添加数据的操作进行回滚,第一个mysql窗口再次查数据表中信息的时候,就读取不到刚刚的添加信息,此时,就表示发生了回滚。
在这里插入图片描述

7.举例说明事务读已提交—不可重复读

1.将事务隔离级别由 可重复读—>读已提交
在这里插入图片描述
2.数据不可重复读:不同时间相同Sql语句所查出的结果不同。读到了其他事务修改的数据。
在这里插入图片描述

8.举例说明事务可重复读—幻读

1.将事务隔离级别改成repeatable read;
在这里插入图片描述
2.幻读是读取到其他事务新增或删除的“幻象”数据。在这里插入图片描述

9.Spring事务传播机制

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

事务传播机制的定义: 指的是Spring中多个事务在相互调用时, 他们之间的行为方式是如何执行的。

2.为什么需要事务传播机制?

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

3.Spring事务传播机制包含七种:

1.propagation.required:默认的事务传播级别,它表示如果当前如果存在事务,就加入事务,如果当前没有事务,就创建一个事务。
2.propagation.supports:如果当前存在事务,就加入事务,如果当前没有事务,就以非事务的方式继续运行。
3.propagation.mandatory(mandatory:强制性)如果当前存在事务就加入事务,如果当前没有事务,就抛出异常。
4.propagation.requires_new:表示创建一个新的事务,如果当前存在事务,就把当前事务挂起。不管外部方法是否开启事务,propagation.requires_new修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。
5.propagation.not_supported:以非事务方式运行,如果当前存在事务,就把当前的事务挂起。
6.propagation.never:以非事务的方式运行,如果当前存在事务,则抛出异常。
7.propagation.nested:如果当前存在事务,创建一个事务作为当前事务的嵌套事务来运行,如果当前没有事务,则取值等价于propagation_required.

4.嵌套事务nested和加入事务required的区别:

1.整个事务如果全部执行成功,二者结果是一样的;
2.如果事务执行到一半失败了,加入事务:整个事务会全部回滚;而嵌套事务会局部回滚,不会影响到上一个方法中执行的结果。

10.事务传播机制–propagation.required 支持当前事务

1.创建log日志表:
在这里插入图片描述
创建user用户表:
在这里插入图片描述
2.在TestController类当中加上一个总事务,事务传播机制为:propagation.required,在这个类当中调用InsertUserServcie类当中的方法和InsertLogService类当中的方法,这两个类当中的方法设置的事务传播机制为:propagation.required。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果:两个数据表中的数据都插入数据成功。
在这里插入图片描述
当调用类(两个类)中的其中一个类执行错误,则整个回滚。
在这里插入图片描述
代码会报错在这里插入图片描述
查看数据库:
在这里插入图片描述
发现:数据没有发生变化
结论:propagation.required事务传播机制的特点是:一个类调用另外两个类的时候,被调用类(一个类)当中有事务,调用类(其他两个类)如果存在事务,就加入,如果调用类中出现了错误,就全部回滚,如果没有出现错误,就添加成功。如果不存在事务,就创建一个事务。

11.事务传播机制–不支持当前事务-(propagation.never)

propagation.never:一个类调用另外两个类的时候,当被调用类没有设置事务传播机制的时候,调用类设置事务传播机制为不支持当前事务(propagation.never),以非事务的方式运行,如果当前存在事务,则抛出异常。
1.当主调用方法事务的传播机制没有设置的时候。
在这里插入图片描述
2.当两个被调用的方法,事务传播机制设置为:propagation.never的时候,在这里插入图片描述
在这里插入图片描述
3.当运行代码的时候,就会报错,因为propagation.never是以非事务方式运行的如果当前存在事务就会抛出异常,并且数据库中的数据也不会增加。
在这里插入图片描述
在这里插入图片描述

12.事务的传播机制–不支持当前事务(propagation.requires_new)

propagation.requires_new:不支持当前的事务,重新创建事务。
1.主调用方法不设置事务的传播机制类型;
在这里插入图片描述
2.另外两个被调用的方法设置事务的传播机制类型为propagation.requires_new;
在这里插入图片描述
在这里插入图片描述
3.可以观察到,因为propagation.requires_new,不支持当前的事务,重新创建事务,所以两个被调用方法重新创建各自的事务,互不影响,所以,当insertLogService方法中出现了10/0这样的错误的时候,inserLogService方法会被中断,而insertUserService方法不会受到影响。
insertLogService方法会报错在这里插入图片描述
在这里插入图片描述


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

相关文章

Spring 事务和事务传播机制

文章目录 1. Spring 事务的实现1.1 Spring 手动操作事务1.2 Spring 声明式事务1.2.1 Transactional 作用范围1.2.2 Transactional 参数说明1.2.3 异常被捕获, 不会事务回滚① 解决办法 --- 将异常重新抛出② 解决办法 --- 手动回滚事务 2. Spring 事务的隔离级别2.1 Spring事务…

关于Spring事务及其传播机制

目录 一丶Spring中事务的实现 <1>事务的四大特性有哪些<2>数据库并发一致性问题以及隔离级别的设置2>隔离可以解决的并发问题<3>Spring事务隔离级别 <1>事务的传播机制是什么&#xff1f;为什么需要传播机制<2>事务的传播机制有哪些&#x…

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 支持…