mysql——事务详解

一、事务定义

  1. 事务:事务是一个最小的不可在分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务是一个最小的工作单元)
  2. 事务保证多条sql语句要么同时执行成功,要么同时执行失败
  3. 一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。
  4. 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。

二、转账操作理解事务

我们来看一个真实的转账业务,表名为t_act(账户、余额),用户1需要向用户2转账100元
我们来看一个真实的转账业务,表名为t_act(账户、余额),用户1需要向用户2转账100元

actno        balance
1            500
2            100

进行转账操作

update t_act set balance=400 where actno=1;
update t_act set balance=200 where actno=2;

以上两台DML语句必须同时成功或者同时失败。最小单元不可再分,当第一条DML语句执行成功后,
并不能将底层数据库中的第一个账户的数据修改,只是将操作记录了一下;
这个记录是在内存中完成的;当第二条DML语句执行成功后,和底层数据库文件中的数据完成同步。
若第二条DML语句执行失败,则清空所有的历史操作记录,要完成以上的功能必须借助事务

三、事务的四大特征

1. 原子性(A )

要求事务要么执行成功,要么执行失败,事物内部不能再分

详解:

一旦某条执行失败,数据的写入马上撤回,即,进行回退操作

2. 持久性(I )

事务一旦提交,那么对数据库的更改就是永久的,接下来的任何操作或事故都不能影响已提交的事务

详解:
数据库的数据存储在磁盘中,但为了方便数据的操作,会在内存中放置一些缓存数据;即使缓存中没有数据,操作数据的话,也主要是跟内存打交道。
CPU不直接和磁盘打交道(因为CPU直接操作内存中数据比操作磁盘中数据快),会将操作好的数据放在内存中的缓存(日志)中,再由缓存(日志)定期将信息写入到磁盘中
但内存存在一个问题,无法永久性存储数据。一旦出现事故(如断电),内存中数据就会消失

就可能会出现下述情况:
一但使用者认为它的事务提交了,提交到缓存中,但缓存还没来得及将数据写入磁盘中,电脑就断电了,便意味着我们并未做到数据的持久化(数据持久化:将数据写入到磁盘等不可更改的地方)

解决方案:
一旦缓存当中的数据无法及时写回到磁盘,对于未配置事务的sql语句,我们选择的是放弃对数据的持久化;但如果sql语句配置了事务,那么事务就会把缓存当中的数据持久化写到磁盘中

事务是如何实现上述操作的:

重做日志,即一旦主机重新启动,那么恢复数据,将数据写回到磁盘中(具体如何实现的这里不做深究)
在这里插入图片描述
关于上述内容,一位大佬的解释

持久性问题的产生:
背景:Mysql为了保证存储效率,每次读写文件都是先对缓存池(Buffer Pool)操作,
缓冲池再定期刷新到磁盘中(这一过程称为刷脏)。
产生:由于数据不是直接写到磁盘,那么如果主机断电,就会有一部分数据丢失。
解决:通过重做日志(redo log)恢复数据。在每次修改数据之前,
都会将相应的语句写到redo log中,如果主机断电,那么再次启动时可通过redo log回复。
拓展:redo log也需要在事务提交时将日志写入磁盘,它比缓冲池写入快的原因有两点:
redo log是追加文件写,属于顺序IO,缓冲池是属于随机IO,且刷脏是以页为单位,
有一点修改就要整页写入。

3. 隔离性(D )

多个事务同时执行,事务和事务之间不能相互干扰

详解:
如张三给李四转100的同时,王五给张三转账100.都在往张三的账户上写入数据,一旦操作不当,数据就会出错

多线程操作同一块资源会很危险,而隔离就是为了处理操作同一块内存空间的危险

4. 一致性(C )

事物执行的结果必须是使数据库从一个一致状态变到另一个一致状态

详解:
原子性、持久性、隔离性的最终目的就是保证一致性

四、和事务相关的术语

在这里插入图片描述

  • 开启事务:Start Transaction
  • 事务结束:End Transaction
  • 事务提交: Commit Transaction ---- 事务回滚: Rollback Transaction

在MySQL中,事务提交与回滚
实现一下
1.创建数据库表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for act
-- ----------------------------
DROP TABLE IF EXISTS `act`;
CREATE TABLE `act`  (`id` int(0) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,`money` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of act
-- ----------------------------
INSERT INTO `act` VALUES (1, '张三', '300');
INSERT INTO `act` VALUES (2, '李四', '300');SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述
2.进行张三给李四转账100操作
(1).提交操作(非事务成功)

update act set money = 400 where id = 2;
update act set money = 200 where id = 1;

在这里插入图片描述
(2).提交操作(非事务失败)

update act set money = 400 where id = 2;
update act set money = 200 where id = 1w; #模拟第二条语句失败

在这里插入图片描述
(3).提交操作(事务成功)

  • start transaction #开始事务
  • DML语句
  • commit #事务提交
start transaction;
update act set money = 400 where id = 2;
update act set money = 200 where id = 1;
commit;

在这里插入图片描述
(4).提交操作(事务失败)

start transaction;
update act set money = 400 where id = 2;
update act set money = 200 where id = 1w; #模拟第二条语句失败
commit;

在这里插入图片描述
(5)回滚操作(事务失败)
事务在执行rollback语句回滚到原来的状态

start transaction;
update act set money = 400 where id = 2;
update act set money = 200 where id = 1w; #模拟第二条语句失败
-- 假设这里出现了错误,我们可以回滚事务
rollback;
-- 或者,如果没有错误,我们可以提交事务
commit;

在这里插入图片描述注意:事务提交之后再进行回滚,回滚是不生效的,因为事务提交后,事务的持久性就会起作用,因此,需要先 rollbackcommit

五、事务的并发问题

1.脏读

事务A读取到了事务B修改但未提交的数据
在这里插入图片描述

2.不可重复读

在同一个事务内,多次读取同一个数据,但是数据值发生了改变。(可以看成脏读的一种)
在这里插入图片描述

3.幻读:

指的是在一个事务中,多次查询同一个范围的数据,却发现有新增或者减少的行
这是因为在这个事务进行的过程中,另一个事务插入或者删除了符合查询条件的数据,导致前后两次查询结果不一致。(可以看成脏读的一种)
在这里插入图片描述

六:事务的隔离等级

为了解决并发所产生的问题,我们提出了事务的隔离级别,隔离级别越高,解决并发产生的问题越多。
背景知识:

  • 读锁和写锁,在读数据时上读锁,在写数据时上写锁。
  • 数据上读锁后不能被其他事务修改,直到读锁释放。
  • 数据上写锁其他事务不能读也不能修改。

隔离性的隔离级别
1.读未提交 read uncommitted
2.读已提交 read committed
3.可重复读 repeatable read
4.串行化 serializable

1.读未提交 read uncommitted

事物A和事物B,事物A未提交的数据,事物B可以读取到。

这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别。
三种并发问题都没解决。

1.创建表:
create table t_user(id int primary key auto_increment,username varchar(255));

设置读未提交的隔离级别

set global transaction isolation level read uncommitted;
#查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;

注:MySQL8中隔离级别的变量跟之前的版本不一样,之前是tx_isolation,MySQL8改成了transaction_isolation
在这里插入图片描述

2.读已提交 read committed

事物A和事物B,事物A提交了数据,事物B才能读取到

这种隔离级别高于读未提交 换句话说,对方事物提交之后的数据,我当前事物才能读取到
这种级别可以避免“脏数据” 这种隔离级别会导致“不可重复读取” Oracle默认隔离级别

设置读已提交的隔离级别

set global transaction isolation level read committed;
#查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;

在这里插入图片描述
可以看出,插入但没有提交,是读不出来的,提交之后才能读出来。

不可重复读和脏读的区别是,脏读读取到的是一个未提交的数据,而不可重复读读取到的是前一个事务已提交的数据。
而不可重复读在一些情况也并不影响数据的正确性,比如需要多次查询的数据也是要以最后一次查询到的数据为主。

3.可重复读 repeatable read

事务A和事务B,事务A提交之后的数据,事务B读取不到,就说事务B是可重复读取数据

这种隔离级别高于读已提交。 换句话说,对方提交之后的数据,我还是读取不到
这种隔离级别可以避免“不可重复读取”,达到可重复读取

  • MySQL默认级别
  • 解决了 “不可重复读” 和 “幻读”

设置可重复读的隔离级别

set global transaction isolation level repeatable read;
#查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;

在这里插入图片描述
可见,无论是删除还是添加,commit后都是成功的,但是另一边却还是读出原来的数据,这就是可重复读,读取的是备份数据不是真正的数据。

4.串行化 serializable

事务A和事务B,事务A在操作数据库时,事务B只能排队等待

这种隔离级别很少使用,吞吐量太低,用户体验差
这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发

设置串行化的隔离级别

set global transaction isolation level serializable;
#查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;

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

七、隔离级别与一致性的关系

在这里插入图片描述

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

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

相关文章

移除Microsoft Edge浏览器“由你的组织管理“提示的方法

背景: 点击Microsoft Edge浏览器右上角的按钮有时候会出现提示“由你的组织管理”。但实际上自己的电脑并没有被公司或其他企业管理。 解决方案: 提示:修改注册表如果操作不当会影响电脑,请提前备份注册表!&#xff…

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发,主要涵盖以下几个方面: 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…

Qt之QCamera的简单使用

文章目录 一、相机操作相关示例1.摄像头操作内容使用示例2.摄像头信息展示使用示例3.摄像头设置切换、预览操作示例 二、相机使用个人操作理解1.相机类支持信息获取2.相机类曝光、焦点、图像处理控制信息获取3.快速启动相机设置(各个设备处于理想状态) 三…

地平线x5下运行yolo11s-seg模型

经过地瓜机器人工作人员(感谢吴超同学)的及时技术支持,整体比较顺利的跑起来了yolo11s-seg分割模型。将一些经验记录下来: 首先下载使用docker镜像: https://developer.d-robotics.cc/forumDetail/228559182180396619 …

linux驱动—注册总线分析

成功地在直接注册了一个总线,并且在总线目录下创建了属性文件,什么会在 sys/bus 目录下生成 mybus,目录以及对应的 devices,drivers, drivers_autoprobe,drivers_probe,uevent目录和属性呢? /sys,目录下的目录都对应一个kobject,…

如何成为录屏高手?2024年全新录屏工具梳理,你选对了吗?

如何录屏?录屏现在对我们来说太重要了,不管是做教学视频、演示文稿,还是录游戏或者教别人怎么用软件,都离不开录屏工具。但是市面上录屏软件一大堆,挑个适合自己的真不容易。今天,我就来给你介绍几款特别火…

知识图谱解码:AI 如何构建知识网络

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 AI工具集1:大厂AI工具【共23款…

凸轮应用实例(带进料装置的伺服压机控制)

凸轮表凸轮关系曲线建立 博途S7-1500T PLC曲柄连杆模型仿真(电子凸轮完整配置+SCL源代码)-CSDN博客文章浏览阅读4次。这篇博客介绍了曲柄连杆机构的位移与曲柄转动角度关系,通过MATLAB进行计算和Simulink验证,并提供博途SCL源代码。文章链接提供了详细的曲柄连杆数学模型分析…

分布式理论基础

文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available(基本可用)2_Soft State(软状态)3_Eventually Consistent(最终一致性)4_总结 1、理论基础 在计算机…

WASM 使用说明23事(RUST实现)

文章目录 1. wasm是什么1.1 chatgpt定义如下:1.2 wasm关键特性: 2. wasm demo2.1 cargo 创建项目2.2 编写code2.3 安装wasm-pack2.4 编译 3.1 html页面引用wasm代码(js引用)3.2 访问页面4 导入js function4.1 编写lib.rs文件,内容…

【SpringCloud】06-Sentinel

1. 雪崩问题 一个微服务出现问题导致一系列微服务都不可以正常工作。 服务保护方案: 请求限流。线程隔离。 服务熔断 2. Sentinel 启动Sentinel java -Dserver.port8090 -Dcsp.sentinel.dashboard.serverlocalhost:8090 -Dproject.namesentinel-dashboard -ja…

【已解决】C# NPOI如何在Excel文本中增加下拉框

前言 上图&#xff01; 解决方法 直接上代码&#xff01;&#xff01;&#xff01;&#xff01;综合了各个大佬的自己修改了一下&#xff01;可以直接规定在任意单元格进行设置。 核心代码方法块 #region Excel增加下拉框/// <summary>/// 增加下拉框选项/// </s…

centeros7 编译ffmpeg

使用yum安装的路似乎已经堵住了&#xff0c;请求的镜像全是404或503 1.打开终端并使用yum安装EPEL存储库(Extra Packages for Enterprise Linux)&#xff1a;sudo yum install epel-release2.接下来&#xff0c;使用以下命令来安装FFmpeg&#xff1a;sudo yum install ffmpeg …

有关spring,springboot项目的知识点

文章目录 1.Spring基本介绍1.1Spring官网1.2Spring的发展 2.SpringBoot2.1SpringBoot快速入门2.1.1创建SpringBoot工程,并勾选web开发相关依赖2.1.2定义HelloController类,并添加方法helllo,且添加注解2.1.3运行测试 3.HTTP协议3.1HTTP协议的概念3.1.1HTTP的特点 3.2HTTP-请求协…

YOLOv8_ ByteTrack目标跟踪、模型部署

YOLOv8目前支持BoT-SORT和ByteTrack两种多目标跟踪算法&#xff0c;默认的目标跟踪算法为BoT-SORT 如果要使用ByteTrack跟踪算法&#xff0c;可以添加命令行参数trackerbytetrack.yaml 一、 VisDrone2019数据集 VisDrone&#xff1a;无人机目标检测和追踪基准数据集。&#x…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

【大模型理论篇】主流大模型的分词器选择及讨论(BPE/BBPE/WordPiece/Unigram)

1. 背景分析 分词是将输入和输出文本拆分成更小单位的过程&#xff0c;使得大模型能够处理。token可以是单词、字符、子词或符号&#xff0c;取决于模型的类型和大小。分词可以帮助模型处理不同的语言、词汇和格式&#xff0c;并降低计算和内存成本。分词还可以通过影响token的…

10-1.idea中的项目结构,辅助快捷键,模块的操作

idea中的项目结构和辅助快捷键 IDEA中项目结构 首先是创建项目&#xff0c;新建的项目中有子项目&#xff0c;我们可以创建模块 然后在模块中我们可以创建包&#xff0c;在包中的SRC中写我们的源代码&#xff0c;也就是类。 VScode写Java项目 如何你电脑比较卡的话&#…

Java中自增自减,赋值,逻辑,三元运算符

自增自减运算符 在某个变量前面或者后面加一--在某个变量前面或者后面减一 可以看见&#xff0c;当a输出时&#xff0c;a是没有变化的&#xff0c;说明如果是在变量后就是先使用再增加&#xff0c;而b输出时&#xff0c;b增加了1&#xff0c;说明如果是在变量前面就是先增加再…

【elkb】linux麒麟v10安装ELKB 8.8.X版本(ARM架构)

下载软件 相关版本信息 elasticsearch&#xff1a;8.8.1kibana&#xff1a;8.8.1logstash&#xff1a;8.8.1filebeat&#xff1a;8.8.1 下载地址 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.1-linux-aarch64.tar.gzhttps://artifacts.elastic…