7天学完Spring:基础学习结束,关于Spring事务及其传播机制

2023-11-12

前言

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

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

一丶Spring中事务的实现

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

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

-- 开启事务
start transaction;
-- 业务执行

-- 提交事务
commit;

-- 回滚事务
rollback;

这样写可能有点空洞,那么我们按照实际来:
在这里插入图片描述

<2>手动操作事务

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

Spring 手动操作事务和上面 MySQL 操作事务类似,它也是有 3 个重要操作步骤:
1.开启事务(获取事务)。
2.提交事务。
3.回滚事务。
SpringBoot 内置了两个对象,DataSourceTransactionManager 用来获取事务(开启事务)、提交或
回滚事务的,而 TransactionDefinition 是事务的属性,在获取事务的时候需要将TransactionDefinition 传递进去从而获得一个事务 TransactionStatus,实现代码如下:
在这里插入图片描述

<3>自动操作事务

声明式事务的实现很简单,只需要在需要的方法上添加 @Transactional 注解就可以实现了,无需手动
开启事务和提交事务,进入方法时自动开启事务,方法执行完会自动提交事务,如果中途发生了没有处理的异常会自动回滚事务,具体实现代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时我传值是true,所以这里会抛出一个异常
在这里插入图片描述
然后看一看我们的SQL数据库,也可以看到值没有修改
在这里插入图片描述
然后我们不让这个异常执行,也就是传一个false
在这里插入图片描述
可以看到此时修改成功
在这里插入图片描述
当然,除了这种做法,还有一种做法:配置一个声明式的AOP代理,拦截符合规则的方法,就可以自动的使用事务。

1>作用域说明

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

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

2>参数说明

在这里插入图片描述

在这里插入图片描述

3>@Transactional 工作原理

@Transactional 是基于 AOP 实现的,AOP 又是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理,如果目标对象没有实现了接口,会使用 CGLIB 动态代理。
@Transactional 在开始执行业务之前,通过代理先开启事务,在执行成功之后再提交事务。如果中途遇
到的异常,则回滚事务。
@Transactional 实现思路预览:
在这里插入图片描述
@Transactional 具体执行细节如下图所示:
在这里插入图片描述

二丶事务隔离级别

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

事务有4 大特性(ACID),原子性、持久性、一致性和隔离性,具体概念如下:这里是引用
上面 4 个属性,可以简称为ACID。
原子性(Atomicity,或称不可分割性)
一致性(Consistency)
隔离性(Isolation,又称独立性)
持久性(Durability)。

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

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

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

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

这里是引用
在这里插入图片描述
注意一下,我这里是部分解决,不是全部解决。

1>隔离级别的解读

这里是引用

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

在这里插入图片描述

<3>Spring事务隔离级别

在这里插入图片描述
在这里插入图片描述
这个我们之后具体实践的时候再细细讲
但是这里不妨碍我们先体现提一下
在这里插入图片描述

三丶事务的传播机制

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

Spring 事务传播机制定义了多个包含了事务的方法,相互调用时,事务是如何在这些方法间进行传递
的。
事务隔离级别是保证多个并发事务执行的可控性的(稳定性的),而事务传播机制是保证一个事务在多
个调用方法间的可控性的(稳定性的)。

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

这里是引用
在这里插入图片描述

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

1>支持当前事务(REQUIRED)

这里是引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里可以看到我没有加注释,为什么呢?
因为REQUIRED是默认的隔离级别,如果也就是我们级别设置当中的
在这里插入图片描述

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

看我下面的代码演示,就是修改了一个权限级别
在这里插入图片描述
然后发起请求,重新访问在这里插入图片描述
先看一下执行结果
在这里插入图片描述
可以发现其实没有修改成功,为什么呢?看我们的执行流程
在这里插入图片描述
然后学的时候,我觉得我自己在这里的问题描述不是很清楚,所以我重新描述一下问题就应该能理解清楚了
在这里插入图片描述
那么我们换种写法,把事务的开启挪一个地方
在这里插入图片描述然后此时我们查看是否修改成功
在这里插入图片描述
这会又可以修改成功了,我们来看日志分析一下
在这里插入图片描述

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

这个演示就很直接了,直接给你报错
在这里插入图片描述
在这里插入图片描述

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

看我如下的代码演示,这个和上面的是有区别的熬,我这里两个方法同时给了嵌套注释,这是加入事务的演示
在这里插入图片描述
此时你可以看到,虽然说我都给了嵌套注释,但是这里其实和我上面的加入事务区别不是很大,为什么呢?往下走,继续往下看
在这里插入图片描述
此时数据库没有被修改,那么我们看看执行流程
在这里插入图片描述
是不是有点迷??没关系,我换种方式再演示一下,看看区别

这里我们设置回滚点
在这里插入图片描述
在这里插入图片描述
可以发现,很神奇的修改成功了在这里插入图片描述
那么我们再来分析分析执行流程
在这里插入图片描述

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

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

所以

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

总结

总结放在我的简介里面吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7天学完Spring:基础学习结束,关于Spring事务及其传播机制 的相关文章

  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Netbeans 8 不会重新加载静态 Thymeleaf 文件

    我通过 Maven 使用 Spring Boot 和 Thymeleaf 当我进行更改时 我似乎无法让 Netbeans 自动重新部署我的任何 Thymeleaf 模板文件 为了看到更改 我需要进行完整的清理 构建 运行 这需要太长的时间
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • java oauth2登录以及权限_OAuth2实现单点登录SSO

    1 前言 技术这东西吧 看别人写的好像很简单似的 到自己去写的时候就各种问题 一看就会 一做就错 网上关于实现SSO的文章一大堆 但是当你真的照着写的时候就会发现根本不是那么回事儿 简直让人抓狂 尤其是对于我这样的菜鸟 几经曲折 终于搞定了
  • WebSocket和HTTP的区别及原理

    HTTP协议 HTTP是单向的 客户端发送请求 服务器发送响应 举例来说 当客户端向服务器发送请求时 该请求以HTTP或HTTPS的形式发送 在接收到请求后 服务器会将响应发送给客户端 每个请求都与一个对应的响应相关联 在发送响应后客户端与
  • Jni基础

    1 JNI 的一般开发流程 1 1 定义好本地的 native 方法 package com darren ndk day13 import java util UUID public class Simple1 public static
  • 【转码方式】-Base64

    Base64 作用 在数据传输过程中 如果报文中存在英文字母以外的字符 就会出现乱码 如中文 图片 或者二进制报文 此时就可以通过Base64将不规则的数据流转化成Base64规定的64个可打印的字符 提高数据的可读性和可打印性 转码原理
  • c++实现合并两个无序数组并以从大到小的顺序排序

    今天做了一下途游游戏的线上笔试题 题目中有一个是合并两个无序数组并排序 从大到小 在这里写一下我的思路 如果有更简单思路的大神请给我留言 我首先想到的一个思路就是把A和B先放在同一个数组里 在随便用一个排序算法对新数组进行排序 这个方法时间
  • Shell脚本中2>&1、>、>>等符号到底是什么含义

    场景 在Linux Shell命令中 我们经常会遇到命令中类似这样的 gt 2 gt 1 符号 那么这些符号是什么含义 有什么用处呢 下面一起来看下 概念 在Linux shell中 0 1 2代表文件描述符 名称 代码 操作符 Java中
  • C++多种解法求最大回文子串

    题目 给定一字符串 求最长的回文子串 解法一 暴力法 循环查找字符串中的所有回文子串 时间复杂度O N3 第一遍循环 选取开始点 i 第二遍循环 选取结束位置 j 第三遍循环 判断 i j 是否为回文字符串 int palindromeA
  • Mysql服务器的外部连接

    目录 前言 Windows上的客户端连接工具有 Linux上连接其他虚拟机上的MySQL服务器 在Windows上通过Navicat连接虚拟机上的Mysql服务器 1 我们先下载好Navicat 2 当我们下载安装好Navicat后 打开它
  • 用org.apache.tools.zip压缩/解压缩zip文件

    package org coolyongzi import java io File import java io FileInputStream import java io FileOutputStream import java io
  • android删除文件夹代码,Android 删除指定文件代码

    package com tware pdfdrop import java io File import android app Activity import android graphics Color import android o
  • LLVM系列第十五章:写一个简单的中间代码生成器IR Generator

    系列文章目录 LLVM系列第一章 编译LLVM源码 LLVM系列第二章 模块Module LLVM系列第三章 函数Function LLVM系列第四章 逻辑代码块Block LLVM系列第五章 全局变量Global Variable LLV
  • 关于2023美赛ABCDEF各题的选题

    本文是关于2023美赛各题的选题以及思路分析 占个位置 比赛开始后会在本帖实时更新赛题思路代码 文章末尾获取 持续为更新参考思路 赛题思路 会持续进行思路模型分析 下自行获取 A题思路 比赛开始后第一时间更新 B题思路 比赛开始后第一时间更
  • Qt 控件尺寸设置

    一 运行无误 Qt 的控件在显示时 有时运行没有问题 但是会有以下信息 QWindowsWindow setGeometry Unable to set geometry 247x97 1200 801 frame 273x168 1187
  • 【python、pycharm安装教程】python3.7和pycharm2019最详细安装教程

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 python3 7和pycharm2019最详细安装教程 一 安装python 二 安装Pycharm 安装路径中不要存在中文 一 安装python 1 双击运行python
  • java 根据word文档模板导出word

    1 创建word模板 2 动态数据占位 格式 xxxxx 3 点击另存为xml格式 4 修改后缀名为ftl 5 导入到idea中 6 修改文件编码为utf 8 7 复制模板内容在线代码格式化 8 编辑模板中内容 如果有空值会报错 可以 xx
  • R-应用流行病学和公共卫生-5.导入

    rio包 我们推荐的 R 包是 rio 名称 rio 是 RI O 输入 输出 的缩写 它的功能import 和export 可以处理许多不同的文件类型 例如 xlsx csv rds tsv 当您提供这些函数的文件路径 包括 csv 之类
  • 【React】hooks的原理

    https medium com ryardley react hooks not magic just arrays cd4f1857236e 参考了这篇文章 对hooks的实现有初步的了解 具体的还是得研究一下官方的 这篇文章用了一个简
  • pptp和l2tp有什么区别

    PPTP协议是点对点隧道协议 其将控制包与数据包分开 控制包采用TCP控制 用于严格的状态查询及信令信息 数据包部分先封装在PPP协议中 然后封装到GREV2协议中 L2TP是国际标准隧道协议 它结合了PPTP协议以及第二层转发L2F协议的
  • 转:基于 Python 和 Scikit-Learn 的机器学习介绍

    我叫Alex 我在机器学习和网络图分析 主要是理论 有所涉猎 我同时在为一家俄罗斯移动运营商开发大数据产品 这是我第一次在网上写文章 不喜勿喷 现在 很多人想开发高效的算法以及参加机器学习的竞赛 所以他们过来问我 该如何开始 一段时间以前
  • 7天学完Spring:基础学习结束,关于Spring事务及其传播机制

    目录 前言 一丶Spring中事务的实现 lt 1 gt MySQL中的事务使用 回顾 lt 2 gt 手动操作事务 lt 3 gt 自动操作事务 1 gt 作用域说明 2 gt 参数说明 3 gt Transactional 工作原理 二