【MySQL】mysql中的事务
目录
- 1、背景
- 2、事务的特性
- 3、事务之间的几种错误
- 【1】脏读
- 【2】不可重复读
- 【3】幻读
- 4、事务中的隔离级别
- 5、总结
1、背景
事务是存储引擎层面实现的,有的引擎支持事务,有的引擎不支持事务,我们常用的引擎InnoDB就支持事务,本文大概讲解一下事务的特性,后续再讲解事务的MVCC(多版本并发控制)如何实现的。
2、事务的特性
事务的特性满足ACID,A(Atomicity):原子性、C(Consistency):一致性、I(Isolation):隔离性、D(Durability):持久性。
1、原子性:一组操作要么全部成功要么全部失败。
2、一致性:数据库从一个有效的状态变为另一个有效的状态。
3、隔离性:事务间的影响程度,四种级别分别为读未提交、读已提交、可重复读、串行化。
4、持久性:事务提交之后就会永久生效,也就是将数据写入磁盘发生异常能恢复。
3、事务之间的几种错误
假设有张表如下:
CREATE TABLE student
(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL DEFAULT '' COMMENT '姓名'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
向其中插入一条数据,后面讲的几种错误都以这条记录作为初始条件:
mysql [xxx]> INSERT INTO student (name) VALUES ('张三');
Query OK, 1 row affected (0.001 sec)mysql [xxx]> SELECT * from student;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
+----+--------+
1 row in set (0.000 sec)
【1】脏读
事务A读取到了事务B未提交修改之后的数据,事务B发生了回滚,此时事务A读取到的数据就是"脏数据",这就叫脏读,举个例子理解:
| 时间顺序 | 事务A | 事务B |
|---|---|---|
| t1 | 开始事务 | 开始事务 |
| t2 | UPDATE student SET name = ‘李四’ WHERE id = 1; [将"张三"更新为"李四"] | |
| t3 | SELECT name FROM student WHRER id =1; [此时读取到的name为"李四"] | |
| t4 | 提交事务 | |
| t5 | 回滚事务 [此时name的值变为"张三"] |
数据库中原本的name值为"张三",t2时刻事务B将name更新为"李四",t3时刻事务A读取到name为"李四",t4时刻事务A提交,t5时刻事务B发送回滚,此时name的值变为"张三",但是事务A读取到的name还是为"李四",这就是读到了一个无效的数据,叫做"脏读"。
【2】不可重复读
事务A只能读取已提交事务的结果,多个已提交事务结果的不同,事务A就可能读到不同的结果,这就叫不可重复读,示例如下:
| 时间顺序 | 事务A | 事务B | 事务C |
|---|---|---|---|
| t1 | 开始事务 | 开始事务 | 开始事务 |
| t2 | SELECT name FROM student WHERE id = 1; [此时读取到的name为"张三"] | ||
| t3 | UPDATE student SET name = ‘李四’ WHERE id =1; [将"张三"更新为"李四"] | ||
| t4 | 提交事务 [此时name为"李四"] | ||
| t5 | SELECT name FROM student WHERE id = 1; [此时读取到的name为"李四"] | ||
| t6 | UPDATE student SET name= ‘王五’ WHERE id =1; [将"李四"更新为"王五"] | ||
| t7 | 提交事务 [此时name为"王五"] | ||
| t8 | SELECT name FROM student WHERE id = 1; [此时读取到的name为"王五"] | ||
| t9 | 提交事务 |
上面t2、t5、t8时刻事务A读取的name分别为:“张三”、“李四”、“王五”。一个事务三次读取结果都不一样,这就叫"不可重复读"。
【3】幻读
事务A两次根据某个条件查询两次的结果由于中途事务B进行了插入导致两次查询结果不一致,这就叫幻读。示例如下:
| 时间顺序 | 事务A | 事务B |
|---|---|---|
| t1 | 开始事务 | 开始事务 |
| t2 | SELECT name FROM student WHERE id < 10; [查出来的只有"张三"] | |
| t3 | INSERT INTO student (name) VALUES (‘李四’); [新插入一条name为"李四"的记录] | |
| t4 | 提交事务 [此时表中有name为"张三"、"李四"两条记录] | |
| t5 | SELECT name FROM student WHERE id < 10; [查出来的有"张三"、“李四”] | |
| t6 | 提交事务 |
事务A种t2时刻和t3时刻查询条件相同,但t3时刻多出来一条记录,这就叫做"幻读"。
4、事务中的隔离级别
事务中有4种隔离级别
| READ UNCOMMITTED | 未提交读 |
| READ COMMITTED | 已提交读 |
| REPEATABLE READ | 可重复读 |
| SERIALIZABLE | 可串行化 |
查看mysql中设置的隔离级别如下:
mysql [xxx]> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set (0.016 sec)
每个隔离级别对应事务之间的问题如下:
| 脏读 | 不可重复读 | 幻读 | |
|---|---|---|---|
| 未提交读 | yes | yes | yes |
| 已提交读 | no | yes | yes |
| 可重复读 | no | no | yes |
| 可串行化 | no | no | no |
未提交读每次都会读取最新的结果;已提交读每次读取的都是已提交事务的结果;可重复读会对所读的行进行加锁,保证读取行的时候不会被其它事务修改;虽然可串行化事务之间不会有并发问题,但是执行效率也是最低的,因为要给每一行去加锁。
5、总结
本文对事务的特性和事务之间的问题有了个大概的认知,后面会再细节讲解事务的回滚机制和MVCC实现原理。
相关文章:
【MySQL】mysql中的事务
目录 1、背景2、事务的特性3、事务之间的几种错误【1】脏读【2】不可重复读【3】幻读 4、事务中的隔离级别5、总结 1、背景 事务是存储引擎层面实现的,有的引擎支持事务,有的引擎不支持事务,我们常用的引擎InnoDB就支持事务,本文…...
大语言模型(LLM)与智能机器人的应用分析
系列文章目录 前言 近年来,大型语言模型(LLM)的集成彻底改变了机器人领域,使机器人能够以人类熟练程度进行交流、理解和推理。本文探讨了 LLM 对机器人的多方面影响,并针对在不同领域利用这些模型的关键挑战和机遇进行了研究。通过将 LLM 应用程序分类并分析核心机器人元素…...
Inno Setup 学习笔记(一)
前言 最近想把自己写的Windows端的软件打包成安装程序exe,又觉得自带的界面太丑了,想自己完全做一个新的页面 网上找到的只有基础教程,记录一下进阶学习过程 生命周期 按照Vue的说法叫生命周期,Inno Setup中叫 Pascal 脚本: 事…...
从阿里云EDM到美团云:典型微服务治理平台的实战经验分享
目录 一. 阿里云 EDM(Enterprise Distributed Application Service) 二. 腾讯云 TSF(Tencent Service Framework) 三. 华为云 FusionStage 四. 京东云 JDC(JD Cloud Microservice Platform) 五. 百度智…...
【接口自动化测试】一文从3000字从0到1详解接口测试用例设计
接口自动化测试是软件测试中的一种重要手段,它能有效提高测试效率和测试覆盖率。在进行接口自动化测试之前,首先需要进行接口测试用例的设计。本文将从0到1详细且规范的介绍接口测试用例设计的过程,帮助读者快速掌握这一技能。 一、了解接口…...
反向代理-缓存篇
文章目录 强缓存一、Expires(http1.0 规范)二、cache-control(http1.1 出现的 header 信息)Cache-Control 的常用选项Cache-Control 常用选项的选择三、弊端协商缓存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since浏览器的三种刷新方式静态资源部署策略…...
【伪代码】数据结构-期末复习 线性表
目录 例1 矩阵相乘 线性表 2.1 线性表的类型定义 例2-1 求并集 LALA∪LB 例2-2 有序表归并 2. 2 线性表的顺序表示和实现 1.构造空表 2.插入 3.删除 4.定位 顺序表的优点: 顺序表的缺点: 例…...
JavaWeb学习、过滤器、ajax异步请求、json、jquery-api文档
一、过滤器: 按照过滤规则筛选出想要的资源。 为什么使用过滤器? 1. 很多地方都需要判断是否登录。如果我们在每个资源出进行判断,非常麻烦。我们可以使用过滤器在访问这些资源前进行判断。 (这样就不用在主界面,修改…...
深入探索 JVM:原理、机制与实战
一、JVM 概述 JVM(Java Virtual Machine)是 Java 程序运行的核心组件,它提供了一个独立于硬件和操作系统的执行环境,使得 Java 程序能够在不同平台上具有跨平台的特性。 JVM 主要由以下几部分组成: 类装载器…...
JavaWeb学习(3)(Servlet详细、Servlet的三种实现方式(面试)、Servlet的生命周期、传统web.xml配置Servlet(了解))
目录 一、Servlet详细。 (1)基本介绍。 (2)基本作用。 1、接收客户端请求数据。 2、处理请求。 3、完成响应结果。 二、Servlet的三种实现方式。 (1)实现javax.servlet.Servlet接口。 1、基本介绍。 2、代码…...
支付宝租赁小程序助力便捷生活新方式
内容概要 支付宝租赁小程序为现代人带来了许多惊喜,它不仅仅是一个简单的租赁平台,更是生活中不可或缺的好帮手。想象一下,无论你缺少什么,从工具到家居用品,只需轻轻一点,便能轻松找到需要的物品。这个小…...
Linux-ubuntu环境配置
一,安装VWware,里面导入镜像文件 这些都是文件夹里面有的,然后对着正点原子视频安装就行,虚拟机的破解码,去百度搜一个能用就行,中间遇见俩问题。①乌班图里面不能上网,②插入U盘后,…...
深入解析下oracle的number底层存储格式
oracle数据库中,number数据类型用来存储数值数据,它既可以存储负数数值,也可以存储正数数值。相对于其他类型数据,number格式的数据底层存储格式要复杂得多。今天我们就详细探究下oracle的number底层存储格式。 一、环境搭建 1.…...
nginx代理rabbitmq和配置 Nginx 代理达梦数据库
在 Nginx 中使用 stream 模块进行 TCP 代理时,可以将 TCP 或 UDP 流量转发到指定的后端服务器。你给出的配置是一个用于代理 RabbitMQ 的示例,具体是在 TCP 层上代理 5672 端口的流量。 只能在nginx.conf配置上代理 stream {# 定义 upstream,…...
汉语唤醒词的模糊判断(Python)
汉语唤醒词的模糊判断【Python】 说明安装库代码Demo其他 说明 这是一个简单的汉语模糊唤醒词的判断器,汉语发音中前后舌以及声母韵母的区别,如果进行精准判断,很容易误判。需要一个模糊判断的逻辑! 安装库 pip install pypinyin代码Demo …...
Redis篇-2--原理篇1--I/O多路复用机制(5种I/O模型,I/O多路复用)
I/O多路复用机制: Redis 是通过I/O多路复用机制来管理大量客户端连接。这使得redis可以实现通过单线程来处理多个客户端连接的请求,避免了为每个客户端创建独立的线程,从而减少了上下文切换的开销,提高了系统的并发性和性能。 理解…...
Knowledge Graph Studio:让知识图谱构建更简单、更智能
一、前言 上周和研究院的同事讨论 2025 年大模型产品规划时,让我产生了一些疑惑和不解,因为从大家交流的规划方向来看,更多的还是集中在Prompt提示词工程(包括提示词的管理、测试、评估、调优)这一块规划的确实挺细&a…...
vue 中实现音视频播放进度条(可拖拽,满足常见开发需求)
由于开发需要,作者封装了一个音视频播放进度条的组件,支持 vue2 及 vue3 ,有需要的朋友后台私信作者获取组件源码哦(工作日每天都在线),下面是对该款组件的介绍。 组件默认样式👇(组…...
[免费]SpringBoot+Vue企业OA自动化办公管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue企业OA自动化办公管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue企业OA自动化办公管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入…...
笔记:在WPF中BitmapSource都有哪些派生类,他们主要功能,使用方法,使用场景
一、目的:在WPF中BitmapSource都有哪些派生类,他们主要功能,使用方法,使用场景 BitmapSource 是 WPF 中图像处理的基类,提供了许多派生类来处理不同类型的图像源。以下是一些常见的 BitmapSource 派生类、它们的主要功…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
