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

Spring事务和事务传播机制

  • 1. 事务回顾
    • 1.1 什么是事务?
    • 1.2 为什么需要事务?
    • 1.3 事务的操作
  • 2. Spring 中事务的实现
    • 2.1 Spring编程式事务(了解)
    • 2.2 Spring声明式事务@Transactional
  • 3. @Transactional 详解
    • 3.1 rollbackFor
    • 3.2 事务隔离级别
      • 3.2.1 MySQL事务隔离级别(回顾)
      • 3.2.2 Spring 事务隔离级别
    • 3.3 Spring 事务传播机制
      • 3.3.1 什么是事务传播机制
      • 3.3.2 事务的传播机制有哪些

1. 事务回顾

1.1 什么是事务?

事务是⼀组操作的集合,是⼀个不可分割的操作.

事务会把所有的操作作为⼀个整体,⼀起向数据库提交或者是撤销操作请求.所以这组操作要么同时成功,要么同时失败.

1.2 为什么需要事务?

在这里插入图片描述

1.3 事务的操作

事务的操作主要有三步:

  1. 开启事starttransaction/begin(⼀组操作前开启事务)
  2. 提交事务:commit(这组操作全部成功,提交事务)
  3. 回滚事务:rollback(这组操作中间任何⼀个操作出现异常,回滚事务)

2. Spring 中事务的实现

Spring 中的事务操作分为两类:

  1. 编程式事务(⼿动写代码操作事务).
  2. 声明式事务(利⽤注解⾃动开启和提交事务).

在学习事务之前,我们先准备数据和数据的访问代码

需求: ⽤⼾注册,注册时在⽇志表中插⼊⼀条操作记录.

数据准备:

-- 创建数据库DROP DATABASE IF EXISTS trans_test;CREATE DATABASE trans_test DEFAULT CHARACTER SET utf8mb4;use trans_test;-- 用户表DROP TABLE IF EXISTS user_info;CREATE TABLE user_info (`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR (128) NOT NULL,`password` VARCHAR (128) NOT NULL,`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now() ON UPDATE now(),PRIMARY KEY (`id`)) ENGINE = INNODB DEFAULT CHARACTER 
SET = utf8mb4 COMMENT = '用户表';
-- 操作日志表DROP TABLE IF EXISTS log_info;CREATE TABLE log_info (`id` INT PRIMARY KEY auto_increment,`user_name` VARCHAR ( 128 ) NOT NULL,`op` VARCHAR ( 256 ) NOT NULL,`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now() ON UPDATE now() 
) DEFAULT charset 'utf8mb4';

2.1 Spring编程式事务(了解)

Spring ⼿动操作事务和上⾯MySQL操作事务类似,有3个重要操作步骤:

  • 开启事务(获取事务)
  • 提交事务
  • 回滚事务

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

2.2 Spring声明式事务@Transactional

声明式事务的实现很简单,只需要在需要事务的⽅法上添加@Transactional 注解就可以实现了.⽆需⼿动开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了没有处理的异常会⾃动回滚事务.

在这里插入图片描述

运⾏程序,发现数据插⼊成功.

修改程序,使之出现异常

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

我们⼀般会在业务逻辑层当中来控制事务,因为在业务逻辑层当中,⼀个业务功能可能会包含多个数
据访问的操作.在业务逻辑层来控制事务,我们就可以将多个数据访问操作控制在⼀个事务范围内.
上述代码在Controller中书写,只是为了⽅便学习.

@Transactional 作⽤

@Transactional 可以⽤来修饰⽅法或类:

  • 修饰⽅法时:只有修饰public⽅法时才⽣效(修饰其他⽅法时不会报错,也不⽣效)[推荐]
  • 修饰类时:对@Transactional 修饰的类中所有的public⽅法都⽣效.

⽅法/类被@Transactional 注解修饰时,在⽬标⽅法执⾏开始之前,会⾃动开启事务,⽅法执⾏结束之后,⾃动提交事务.

如果在⽅法执⾏过程中,出现异常,且异常未被捕获,就进⾏事务回滚操作.

如果异常被程序捕获,⽅法就被认为是成功执⾏,依然会提交事务.

⼿动回滚事务
在这里插入图片描述

3. @Transactional 详解

在这里插入图片描述

3.1 rollbackFor

@Transactional 默认只在遇到运⾏时异常和Error时才会回滚,⾮运⾏时异常不回滚.即Exception的⼦类中,除了RuntimeException及其⼦类.

在这里插入图片描述
在这里插入图片描述
结论:

  • 在Spring的事务管理中,默认只在遇到运⾏时异常RuntimeException和Error时才会回滚.
  • 如果需要回滚指定类型的异常,可以通过rollbackFor属性来指定.

3.2 事务隔离级别

3.2.1 MySQL事务隔离级别(回顾)

SQL标准定义了四种隔离级别,MySQL全都⽀持.这四种隔离级别分别是:
在这里插入图片描述
在这里插入图片描述

3.2.2 Spring 事务隔离级别

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

3.3 Spring 事务传播机制

3.3.1 什么是事务传播机制

事务传播机制就是:多个事务⽅法存在调⽤关系时,事务是如何在这些⽅法间进⾏传播的.

⽐如有两个⽅法A,B都被@Transactional 修饰, A⽅法调⽤B⽅法A⽅法运⾏时,会开启⼀个事务.

当A调⽤B时,B⽅法本⾝也有事务,此时B⽅法运⾏时,是加⼊A的事务,还是创建⼀个新的事务呢?

这个就涉及到了事务的传播机制.

  • 事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题
    在这里插入图片描述
  • ⽽事务传播机制解决的是⼀个事务在多个节点(⽅法)中传递的问题在这里插入图片描述

3.3.2 事务的传播机制有哪些

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

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

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

相关文章

uptrained的解释

问题来源 language model checkpoints with multihead attention (MHA) can be uptrained (Komatsuzaki et al., 2022) to use MQA with a small fraction of original training compute 而翻译词典无法翻译 解释: “uptrained” 这个词没有直接的中文翻译&…

航道大数据应用专项研究报告(附下载)

总体目标 充分认识航道大数据对行业治理的重要性和必要性,航道大数据的开发和利用是建设智慧航道的基础。基于大数据的航道管理体系,实现了现有数据的梳理和汇聚,跨部门数据的交换和整合,建立了数据关联和深度学习的模型机制&…

【华为】GRE VPN 实验配置

【华为】GRE VPN 实验配置 前言报文格式 实验需求配置思路配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN :(Virtual Private Network),即“…

supervision区域行人计数和轨迹追踪初步尝试

1、背景介绍 最近,一位朋友向我介绍了定位与视觉融合的需求,我发现这个想法非常有价值。恰逢我了解到了Supervision框架,便决定尝试运用它来进行初步的测试。这样做不仅有助于探索可以实际应用的项目,还能促进我自己在研究创新方…

多线程有三个必须要保证的特性,才能正常运行(三个特性是:有序性,可见性,原子性)JMM的作用就是保证这三个特征

有序性的原因,和保证措施(as-if-serial) JVM执行代码时,可能会优化编译器和优化CPU的性能发挥,所以会进行对 代码顺序调整。当然,此顺序会保证as-if-serial(也就是再怎么优化顺序,单…

计算斐波那契数

前提需备知识: 斐波那契数列是第一项和第二项为1,第三项为前两项之和,然后以此类推的一个数列,即1,1,2,3,5,8,13,21,34,5…

2024年第四届能源与环境工程国际会议(CoEEE 2024) | Ei Scopus检索

会议简介 Brief Introduction 2024年第四届能源与环境工程国际会议(CoEEE 2024) 会议时间:2024年5月22日-24日 召开地点:意大利米兰 大会官网:www.coeee.org CoEEE 2024将围绕“能源与环境工程”的最新研究领域而展开,为研究人员、…

Fashion MNIST数据集介绍及基于Pytorch下载数据集

Fashion MNIST数据集介绍及基于Pytorch下载数据集 🌵文章目录🌵 🌳引言🌳🌳Fashion MNIST数据集简介🌳Fashion MNIST数据集的类别说明Fashion MNIST数据集图片示例 🌳基于PyTorch下载Fashion MN…

SpinrgBoot-Mybatis基础

​ JDBCMyBatis概述MyBatis基础应用MyBatis动态标签 一、JDBC( Java DataBase Connectivity ):Java连接数据库的解决方案 概念:JDBC就是Java后端操作数据库的解决方案,操作数据的指令应该来自于前端,前端把数据提交到后端Java代…

嵌入式软件中常见的 8 种数据结构

数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。 几乎所有已开发的程序或软件系统都使用数据结构。此外,数据结构属于计算机科学和软件工程的基础。当…

UE4 C++ 静态加载类和资源

静态加载类和资源:指在编译时加载,并且只能在构造函数中编写代码 .h //增加所需组件的头文件 #include "Components/SceneComponent.h" //场景组件 #include "Components/StaticMeshComponent.h" //静态网格体组件 #include &qu…

Java 虚拟机

1.什么是 JVM? JVM——Java 虚拟机,它是 Java 实现平台无关性的基石。 Java 程序运行的时候,编译器将 Java 文件编译成平台无关的 Java 字节码文件(.class),接下来对应平台 JVM 对字节码文件进行解释,翻译成对应平台…