【Mysql】事务管理:原理、操作与应用
文章目录
- 一、事务概述
- 二、事务的特性(ACID)
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
- 三、事务的操作
- 事务的提交方式
- 查看和设置隔离级别
- 四、事务常见问题
- 脏写 / 修改丢失
- 脏读
- 不可重复读
- 幻读
- 五、多版本并发控制(MVCC)
在数据库应用开发中,数据的完整性和一致性至关重要。MySQL 事务管理机制能够确保一组相关操作要么全部成功执行,要么全部失败回滚,有效保障了数据的可靠性。今天,我们就一起来深入探讨 MySQL 事务管理的相关知识。
一、事务概述
事务是逻辑上的一组操作,这些操作要么全执行,要么全不执行,是一个不可分割的整体。比如常见的银行转账场景,从 A 账户扣除一定金额,同时向 B 账户增加相同金额,这两个操作必须同时成功或者同时失败,否则就会出现数据不一致的问题,而这两个操作就可以构成一个事务。
二、事务的特性(ACID)
原子性(Atomicity)
事务是最小的执行单位,不允许分割。就像前面提到的转账操作,不能只完成从 A 账户扣款,却不增加 B 账户的金额。如果事务执行过程中出现错误,所有已执行的操作都会被回滚,就如同这个事务从未执行过一样。原子性是通过 InnoDB 存储引擎的 undo log 来实现的,当事务对数据库进行修改时,InnoDB 会生成 undo log;若事务执行失败或回滚,就利用 undo log 中的信息将数据恢复到修改前的状态。
一致性(Consistency)
执行事务的前后,数据要保持一致状态。例如,在一个简单的库存管理系统中,商品的总库存数量在进行出库或入库事务前后应该是符合业务规则的。一致性不仅依赖于数据库层面的保障,也需要应用层面的配合,确保事务的操作符合所有预设规则。
隔离性(Isolation)
当多个事务并发访问数据库时,一个用户的事务不应该被其他事务所干扰,各并发事务之间数据库是独立的。MySQL 提供了不同的隔离级别来控制事务之间的隔离程度:
读未提交(Read Uncommitted):最低的隔离级别,允许读取尚未提交的数据变更。这种级别可能会导致脏读(读取到其他事务未提交的数据)、不可重复读(同一次事务中前后查询结果不一致)和幻读(事务执行过程中,前后查询的数据量发生变化)等问题。
读已提交(Read Committed):只允许读取并发事务已经提交的数据,可以避免脏读,但仍可能出现不可重复读和幻读问题。
可重复读(Repeatable Read):MySQL 中 InnoDB 存储引擎的默认隔离级别,保证在同一个事务中,对同一字段多次读取的结果都是一致的,除非本事务对其进行了修改。该级别可以避免脏读和不可重复读,但在某些情况下仍可能出现幻读。
串行化(Serializable):最高的隔离级别,所有事务依次执行(串行执行),可以完全避免脏读、不可重复读和幻读问题,但由于是串行执行,并发性能较低。
持久性(Durability)
一个事务被提交后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有影响。InnoDB 通过 redo log 来实现持久性,当数据被修改时,除了修改内存中的数据,还会在 redo log 中记录这次操作。事务提交时,会调用 fsync 接口对 redo log 进行刷盘。这样,如果 MySQL 宕机,重启时可以读取 redo log 中的数据,对数据库进行恢复。
三、事务的操作
事务的提交方式
自动提交:MySQL 默认每一条 DML(数据操作语言,如 INSERT、UPDATE、DELETE)语句都是一个单独的事务,即自动提交。可以通过show variables like ‘autocommit’;查看 autocommit 的状态,set autocommit=1;设置为自动提交(1 表示开启,0 表示关闭)。
手动提交:使用START TRANSACTION 或 BEGIN命令显式开启一个事务,然后执行一系列相关的 SQL 语句。如果所有操作都成功,使用COMMIT命令提交事务,使得对数据库的修改成为永久性;如果在执行过程中出现错误,则使用ROLLBACK命令回滚事务,撤销正在进行的所有未提交的修改。在手动提交事务中,还可以使用SAVEPOINT命令创建保存点,方便将事务回滚到指定的保存点,语法为SAVEPOINT savepoint_name;,回滚到保存点使用ROLLBACK TO SAVEPOINT savepoint_name; 。
查看和设置隔离级别
查看隔离级别:在 MySQL 5.7 及之前版本,可以使用select @@tx_isolation;查看当前会话的隔离级别;在 MySQL 8.0 中,使用SELECT @@transaction_isolation; 。
设置隔离级别:设置全局隔离级别使用SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别; ,设置当前会话隔离级别使用SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别; ,其中 “隔离级别” 可以是READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE 中的一种。需要注意的是,设置全局隔离级别后,新创建的会话会采用新的隔离级别,而已经存在的会话不受影响;设置当前会话隔离级别只对当前会话有效。
四、事务常见问题
脏写 / 修改丢失
当两个事务在未提交的状况下,都修改同一条数据,若一个事务回滚,可能会把另一个事务修改的值也撤销。比如事务 A 和事务 B 同时修改某条记录,事务 A 先修改了值,事务 B 接着也做了修改,然后事务 A 回滚,那么事务 B 的修改也会被覆盖,就造成了脏写。
脏读
事务读取到其他事务未提交的数据。例如,事务 A 修改了某条数据但还未提交,此时事务 B 读取了这条被修改但未提交的数据,若事务 A 回滚,事务 B 读取的数据就是无效的,这就是脏读。
不可重复读
在同一次事务中前后查询不一致。比如在事务中先查询了某条记录的某个字段值,之后在事务未结束前,其他事务修改并提交了该记录,再次查询时得到的结果与第一次不同,这就是不可重复读。
幻读
在一次事务中前后数据量发生变化,导致用户产生不可预料的问题。通常发生在范围查询时,例如事务 A 查询满足某条件的一批数据,在事务 A 未结束时,其他事务插入了满足该条件的新数据,当事务 A 再次进行相同的范围查询时,结果中就多了新插入的数据,就像产生了幻觉一样,这就是幻读。
五、多版本并发控制(MVCC)
MVCC 是一种用来解决读 - 写冲突的无锁并发控制机制,能提高数据库并发读写的性能,同时还可以解决脏读、幻读、不可重复读等事务隔离问题。在并发读写数据库时,快照读(不加锁的 select 操作)不用阻塞写操作,写操作也不用阻塞读操作。
MVCC 的实现依赖于以下几个关键要素:
隐藏字段:记录中有一些隐藏字段,如DB_ROW_ID(隐含的自增 ID,当数据表没有主键时,InnoDB 会自动以它产生聚簇索引)、DB_TRX_ID(最近修改或插入事务 ID)、DB_ROLL_PTR(回滚指针,指向这条记录的上一个版本,通过链表形式组织)和DELETED_BIT(删除标记位,删除操作只是设置该标记位,并非真正删除记录,InnoDB 有专门的 purge 线程来清理标记为删除的记录) 。
undo log:用于事务的回滚操作,保证事务的原子性,同时还能构建数据修改之前的版本,支持多版本读。
Read View:事务进行快照读操作时产生的读视图,通过可见性算法,将当前事务与活跃事务进行比对分析,生成读视图。如果读取的数据的事务 ID 与当前事务 ID 相等,读取的就是最新数据;不相等时,就通过回滚指针遍历 undo log 链表,查找符合条件的记录的数据。
相关文章:
【Mysql】事务管理:原理、操作与应用
文章目录 一、事务概述二、事务的特性(ACID)原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability) 三、事务的操作事务的提交方式查看和…...
PHP框架 ThinkPHP 漏洞探测分析
目录 1. PHP历史利用最多的漏洞有哪些? 2. 如何在信息收集的过程中收到框架信息?有什么根据? 3. ThinkPHP框架漏洞扫描有哪些工具?红队攻击有哪些方式? 漏洞扫描工具 红队攻击方式 4. TPscan工具的主要作用及实际…...
A Brief History: from GPT-1 to GPT-3
This is my reading notes of 《Developing Apps with GPT-4 and ChatGPT》. In this section, we will introduce the evolution of the OpenAI GPT medels from GPT-1 to GPT-4. GPT-1 In mid-2018, OpenAI published a paper titled “Improving Language Understanding …...
大模型在支气管肺癌预测及临床决策中的应用研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 二、大模型预测支气管肺癌的原理与技术基础 2.1 大模型简介 2.2 数据收集与预处理 2.3 模型训练与优化 三、术前预测 3.1 病情评估 3.1.1 肿瘤大小、位置及分期预测 3.1.2 转移风险预测 3.2 手术风险预测 3.2.1 患…...
SylixOS 中 select 原理及使用分析
1、select接口简介 1.1 select接口使用用例 select 是操作系统多路 I/O 复用技术实现的方式之一。 select 函数允许程序监视多个文件描述符,等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指:文件描述符不再是阻塞状…...
软考笔记——软件工程基础知识
第五章节——软件工程基础知识 软件工程基础知识 第五章节——软件工程基础知识一、软件工程概述1. 计算机软件2. 软件工程基本原理3. 软件生命周期4. 软件过程 二、软件过程模型1. 瀑布模型2. 增量模型3. 演化模型(原型模型、螺旋模型)4. 喷泉模型5. 基于构建的开发…...
FastGPT原理分析-数据集创建第二步:处理任务的执行
概述 文章《FastGPT原理分析-数据集创建第一步》已经分析了数据集创建的第一步:文件上传和预处理的实现逻辑。本文介绍文件上传后,数据处理任务的具体实现逻辑。 数据集创建总体实现步骤 从上文可知数据集创建总体上来说分为两大步骤: &a…...
基于Python的3D贴图制作技术研究与实践
摘要:本文深入探讨了利用Python进行3D贴图制作的技术,介绍了Python在3D图形领域的应用优势,阐述了3D贴图的基本原理和常见类型。详细讲解了借助Python的相关库,如Pillow、OpenCV、PyTorch3D开展3D贴图制作的流程,包括纹…...
【MySQL数据库】视图 + 三范式
视图 视图的基本介绍 MySQL中的视图(View)是一种虚拟的表,其内容是从一个或多个基本表中检索出来的。视图可以简化复杂的查询操作,提高查询效率,同时也可以对敏感数据进行安全性控制。下面是关于MySQL视图的一些基本…...
STM32学习笔记之存储器映射(原理篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
如何通过数据可视化提升管理效率
通过数据可视化提升管理效率的核心方法包括清晰展示关键指标、及时发现和解决问题、支持决策优化。其中,清晰展示关键指标尤为重要。通过数据可视化工具直观地呈现关键绩效指标(KPI),管理者能快速、准确地理解业务现状,…...
数据结构:利用递推式计算next表
next 表是 KMP 算法的核心内容,下面介绍一种计算 next 表的方法:利用递推式计算 如图 6.3.1 所示,在某一趟匹配中,当对比到最后一个字符的时候,发现匹配失败(s[i] ≠ t[j])。根据 BF 算法&…...
每日算法-250326
83. 删除排序链表中的重复元素 题目描述 思路 使用快慢指针遍历排序链表。slow 指针指向当前不重复序列的最后一个节点,fast 指针用于向前遍历探索。当 fast 找到一个与 slow 指向的节点值不同的新节点时,就将 slow 的 next 指向 fast,然后 …...
trino查询mysql报Unknown or incorrect time zone: ‘Asia/Shanghai‘
问题 trino查询mysql时报Error listing schemas for catalog mysql: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.,trino的日志中看到Unknown or incorrect time zone…...
java学习笔记7——面向对象
关键字:static 类变量 静态变量的内存解析: 相关代码: public class ChineseTest {public static void main(String[] args) {System.out.println(Chinese.nation); //null 没赋值前System.out.println(Chinese.nation); //中国 静态变量赋值…...
leetcode day31 453+435
453 用最少数量引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地…...
C++三大特性之继承
1.继承的概念及定义 回忆封装 C Stack类设计和C设计Stack对比。封装更好:访问限定符类的数据和方法放在一起 -> 避免底层接口的暴露,数据更加的安全,程序的耦合性更高迭代器的设计,封装了容器底层结构,在不暴露底层…...
PyQt QDoubleSpinBox控件用法详解
QDoubleSpinBox 是 PyQt中用于输入浮点数的控件,支持键盘输入和上下箭头调整数值。与QtSpinBox不同,QtSpinBox是用于输入整数的控件。 关键属性和方法 QDoubleSpinBox 的关键属性和方法如下表所示: 方法/属性说明setRange(min, max)设置数…...
解决Vmware 运行虚拟机Ubuntu22.04卡顿、终端打字延迟问题
亲测可用 打开虚拟机设置,关闭加速3D图形 (应该是显卡驱动的问题,不知道那个版本的驱动不会出现这个问题,所以干脆把加速关了)...
查询Marklogic数据库,因索引配置造成的返回数据count不同的问题
查询Marklogic数据库,因索引配置造成的返回数据count不同的问题 一,问题: 目前由两个MarkLogic DB,其中A表示所有的数据库统称,包含于BCD; 调用查询接口,通过A和B入口且相同的查询条件去查询B…...
ctfshow做题笔记—栈溢出—pwn73、pwn74
目录 一、pwn73(愉快的尝试一下一把梭吧!) 二、pwn74(噢?好像到现在为止还没有了解到one_gadget?) 前言: 抽空闲时间继续学习,记录了两道题,pwn74卡了几天哈哈。 一、pwn73(愉快的尝试一下一把梭吧!) …...
026-zstd
zstd 以下为Zstandard(zstd)压缩算法从原理到代码实现的技术调研报告,结合流程图、结构图及完整C代码实现: 一、核心原理与技术架构 1.1 算法原理 Zstd基于LZ77衍生算法与熵编码(FSE/Huffman)的混合架构&…...
AF3 quat_to_rot函数解读
AlphaFold3 rigid_utils 模块的 quat_to_rot 函数的功能是把四元数转换为旋转矩阵,函数利用预定义的四元数到旋转矩阵的转换表 _QTR_MAT 来简化计算。 理解四元数到旋转矩阵的转换 源代码: _quat_elements = ["a", "b", "c", "d"]…...
Elasticsearch 的搜索功能
Elasticsearch 的搜索功能 建议阅读顺序: Elasticsearch 入门Elasticsearch 搜索(本文) 1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能,现在先将文档添加到索引中,接下来完成搜索的方法。 查询的分类&…...
Vala编成语言教程-构造函数和析构函数
构造函数 Vala支持两种略有不同的构造方案:我们将重点讨论Java/C#风格的构造方案,另一种是GObject风格的构造方案。 Vala不支持构造函数重载的原因与方法重载不被允许的原因相同,这意味着一个类不能有多个同名构造函数。但这并不构成问题&…...
Mybatis-plus配置动态多数据源
前言:微服务架构中,有些模块中可能不同组件用不同数据源,或者做数据库主从集群需要读写分离,动态切换数据源,或不同方法需要不同数据源就需要一个快捷方便的方法。引用动态数据源组件dynamic-datasource-spring-boot-s…...
CSS+JS 堆叠图片动态交互切换
结合DeepSeek提供的代码,终于实现了堆叠两张图片动态循环切换,以下是代码: 通过绝对定位放了两张图片 <div class"col-lg-5" style"z-index: 40; position: relative;"><img src"images/banner_1.png&quo…...
内存检查之Valgrind工具
内存检查之Valgrind工具 Author: Once Day Date: 2025年3月26日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSD…...
强大的AI网站推荐(第四集)—— Gamma
网站:Gamma 号称:展示创意的新媒介 博主评价:快速展示创意,重点是展示,在几秒钟内快速生成幻灯片、网站、文档等内容 推荐指数:🌟🌟🌟🌟🌟&#x…...
javafx项目结构+代码规范
javafx项目 1. 新建项目,对项目的理解 jdk: 是 Java Development ToolKit 的简称,也就是 Java 开发工具包。JDK 是整个 Java 的核心,包括 Java 运行环境(Java Runtime Envirnment,简称 JRE)&a…...
