【MySQL】数据库事务详解

文章目录
- 前言
- 1. 事务的定义
- 2. 事务的四个特性
- 2.1 原子性
- 2.2 一致性
- 2.3 隔离性
- 2.4 持久性
- 3. 事务的并发问题
- 3.1 脏读
- 3.2 不可重复读
- 3.3 幻读
- 3.4 更新丢失
- 4. 事务的隔离级别
- 5. 事务的使用
- 结语
前言
假设我们现在需要操作数据库进行转账,A 给 B 转账 100 块钱,我们就需要操作数据库,先扣除 A 账户 100 块钱, 再给 B 账户添加 100 块钱,这样才实现转账成功。但如果我们在扣除的过程中,服务器突然宕机了,那不就乱套了吗,A 发现自己钱少了,但 B 又没有收到钱。此时就需要事务来帮忙了
1. 事务的定义
事务指的是由一个或者多个数据库操作单元组成,相当于把多个 sql 语句打包成一个整体,这个整体就叫做事务,执行的时候,要么全部成功,要么全部失败,不可能存在部分执行成功部分执行失败的情况
这就是为什么事务能解决我们上面所遇到的转账失败场景:我们可以把整个转账过程所需要的 sql 语句组成一个事务,不会存在扣除 A 的账户上的钱而 B 账户的钱也没增加的情况了
那事务是怎么做到 “要么全部成功,要么全部失败” 的呢?究其内部原理,我们可以知道,当事务执行失败时,也就是在执行事务内部的 sql 语句时,数据库发现错误,那它就会自动还原成事务之前的状态,撤销之前的 sql,这样的机制也叫做 “回滚”(rollback)
为了实现回滚,数据库管理系统会记录事务的所有操作到日志中。如果需要回滚,系统会根据日志中的记录撤销操作,将数据库状态恢复到事务开始之前的状态
2. 事务的四个特性
事务的四个特性通常被称为ACID属性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),它们共同确保了事务的可靠性和数据的一致性
2.1 原子性
原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。如果事务中的任何操作失败,整个事务将被回滚,将数据库状态恢复到事务开始之前的状态(最重要的特性)
2.2 一致性
一致性(Consistency):在事务开始之前和事务结束之后,数据库都必须处于一致的状态,即所有的数据都符合数据库的规则和约束
2.3 隔离性
隔离性(Isolation):并发执行的事务之间不会互相影响。每个事务都应该像在独立运行一样,即使多个事务同时进行,它们也应该彼此隔离,以避免数据不一致的问题
2.4 持久性
持久性(Durability):一旦事务被提交,它对数据库的改变就是永久性的。即使系统发生故障,已经提交的事务的结果也不会丢失
不同的数据库管理系统可能会根据ACID属性的不同实现方式,提供不同的性能和一致性保证
3. 事务的并发问题
在数据库系统中,当多个事务同时执行并尝试访问或修改相同的数据时,可能会遇到的一系列并发问题,下面就让我来一一介绍它们
3.1 脏读
脏读(Dirty Read):一个事务读取了另一个事务未提交的更改。如果那个事务最终回滚,那么读取的数据就是无效的
举个例子:现在有两个事务 T1 和 T2 并发执行,其中 T1 在针对某个表的数据进行修改,T1 在执行的过程中,T2 也去读这个表的数据,当 T2 读完后,T1 回滚了,这就导致 T2 读到的数据不是最终的“正确数据”,而是读到了临时的”脏数据“
3.2 不可重复读
不可重复读(Non-repeatable Read):当一个事务重新执行相同的查询,但是得到不同的结果,这是由于另一个事务在两次查询之间修改了数据并提交了更改
举个例子:现在有两个事务 T1 和 T2,T2 对某个表进行查询,得到第一次查询结果,T1 对该表的数据进行了修改,之后 T2 再次对表进行相同查询,但得到的查询结果和第一次不一样,这就是不可重复读
3.3 幻读
幻读(Phantom Read):当一个事务重新执行相同的查询,但是得到不同的数据集合(比如不同的行数),这通常是因为另一个事务插入或删除了一些行
举个例子:现在有两个事务 T1 和 T2,T1 在表中读取了一个字段,然后 T2 在同一个表中新增或者删除了一些数据,T1 再次读取该表时,就会发现多出或者少了几行数据,数据集不一样
3.4 更新丢失
更新丢失(Lost Update):两个或多个事务读取同一数据项,基于这个数据进行计算并尝试更新,如果这些更新几乎同时发生,一个事务的更新可能会覆盖另一个事务的更新
不可重复读和幻读的区别:
- 不可重复读关注的是单个数据项的更改
- 幻读关注的是数据集合整体的变化
- 两者都是由于其他事务的介入导致的读取结果不一致,但不可重复读更侧重于单个数据项的层面,而幻读更侧重于数据的集合层面
4. 事务的隔离级别
因为在多个事务同时执行并尝试访问或修改相同的数据时,可能会遇到上面的脏读、不可重复读、幻读、更新丢失等问题,所以 MySQL 中提供了四种隔离级别来解决并发问题,它们按照提供的隔离保护从弱到强
- 读未提交(READ UNCOMMITTED):一个事务可以读取另一个事务未提交的数据,会出现脏读、不可重复读、幻读
- 读已提交(READ COMMITTED):一个事务只能读取另一个事务提交之后的数据,即给写操作加共享锁,但会出现不可重复读、幻读
- 可重复读(REPEATABLE READ):事务在整个过程中可以重复读取到相同的数据行,即给写操作和读操作都加锁,但会出现幻读
- 串行化(SERIALIZABILITY):事务将依次顺序执行,就像它们在一个没有并发的环境中一样,可以防止所有并发问题,包括脏读、不可重复读和幻读
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 | √ | √ | √ |
| 读已提交 | X | √ | √ |
| 可重复读 | X | X | √ |
| 串行化 | X | X | X |
从一到四的隔离级别,它们的事务隔离性逐渐增强,并行程度逐渐减弱,执行速度也逐渐减慢。在 MySQL 中,默认的隔离级别是可重复读
5. 事务的使用
-- 开启事务
start transaction;-- 执行多条 SQL 语句-- 回滚或者提交(rollback 是全部失败,commit 是全部成功)
rollback / commit;
要注意:回滚机制是针对事务这一操作,我们不能把 drop database 这种危险操作也回滚回来
结语
事务保障了数据库的数据完整性和一致性,而且还能通过隔离级别来处理并发问题,同时它也支持我们进行更加复杂的业务需求,掌握事务对我们来说十分有必要,本篇博客中对于事务的具体操作介绍还不够详细,之后博主会更加深入地学习事务,再进行补充
希望大家能够喜欢本篇博客,有总结不到位的地方还请多多谅解。若有纰漏,希望大佬们能够在私信或评论区指正,博主会及时改正,共同进步!
相关文章:
【MySQL】数据库事务详解
文章目录 前言1. 事务的定义2. 事务的四个特性2.1 原子性2.2 一致性2.3 隔离性2.4 持久性 3. 事务的并发问题3.1 脏读3.2 不可重复读3.3 幻读3.4 更新丢失 4. 事务的隔离级别5. 事务的使用结语 前言 假设我们现在需要操作数据库进行转账,A 给 B 转账 100 块钱&…...
ubuntu链接mysql
C链接mysql 报错 sudo apt-get update sudo apt-get install libmysqlclient-dev 指令编译 g -o mysql_example mysql_example.cpp -I/usr/include/mysql -lmysqlclient g mysql_test.cpp mysql_config --cflags --libs 安装mysql sudo apt updatesudo apt install mysql-…...
QStyledItemDelegate 和 QItemDelegate 的作用
在Qt中,QStyledItemDelegate和QItemDelegate是用于自定义和控制项视图控件(如QListView、QTableView、QTreeView)中项的显示和编辑的委托类。它们提供了对项的外观和编辑行为的定制能力。尽管它们在功能上有相似之处,但它们之间有…...
3.任务的创建与删除
1.什么是任务? 任务可以理解为进程/线程,创建一个任务,就会在内存开辟一个空间。 任务通常都含有while(1)死循环 2.任务创建与删除相关的函数 3.CUBEMAX相关配置 编辑一个led1闪烁的任务...
进程、CPU、MMU与PCB之间的关系
目录 进程与cpu(中央处理器) 源代码、程序、cpu与进程的关系 cpu超线程 CPU的简易架构与处理数据过程 进程与MMU(内存管理单元) mmu作用 cpu和mmu的关系 进程与PCB(进程控制块) PCB介绍与内部成员…...
代码随想录算法训练营Day50|1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列
最长公共子序列 1143. 最长公共子序列 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 最长公共子序列 - 动态规划 Longest Common Subsequence - Dynamic Programming_哔哩哔哩_bilibili 本题和上一题718.最长重复子数组在很多方面相似…...
国家自然科学基金标书大全(2002-2024)
数据来源:在20世纪80年代初,为了促进中国的科技体制革新并改革科研资金分配机制,中国科学院的89位院士联名向党和国家领导人提出建议,设立了国家自然科学基金的设立。国自然基金自创立以来,根据国家发展科学技术方针、…...
Python代码打包成exe应用
目录 一、前期准备 二、Pyinstaller打包步骤 Pyinstaller参数详解 三、测试 Spec 文件相关命令 一、前期准备 (1)首先,我们需要确保你的代码可以在本地电脑上的pycharm正常运行成功。 (2)我们要先安装Pyinstalle…...
CesiumJS【Basic】- #016 多边形面渲染“花了”的问题
文章目录 多边形面渲染“花了”的问题1 目标2 问题代码3 修正后代码4 总结多边形面渲染“花了”的问题 1 目标 解决多边形的面“花了”的问题 2 问题代码 使用Cesium.PerInstanceColorAppearance渲染后出现色斑 import * as Cesium from "cesium";const viewer …...
qt 开发对信号槽进行二次封装,实现信号槽管理接口。
最近做的一个项目,由于工程需要模块之间能够互相通信,但又不想模块之间耦合度太高 使用信号槽的话,需要两个类的对象或者指针在其中一个类都要体现,这样达不到效果, 想要一个管理类对这些互相通信的类之间进行管理,只需要在各自的类注册发送者和接收者即可,双方通过一…...
本地项目上传到gitee
本地项目通过webstorm上传到gitee 1.登录gitee选择新建仓库 2.输入新建仓库的名字(名字与本地项目名一致) 3.复制链接 4.找到本地项目,选中地址输入cmd打开命令提示框 5.输入git init初始化git,生成.git文件 6.webstorm中打开项目…...
ONLYOFFICE 8.1版本桌面编辑器测评:超越想象的办公体验!
在当今数字化办公时代,一个功能强大、操作便捷的办公套件对于提高工作效率至关重要。ONLYOFFICE 8.1作为一款备受瞩目的办公软件,凭借其全面的功能、优异的性能和出色的用户体验,为用户带来了超越想象的办公体验。下面,我们将对ON…...
中介子方程三十四
XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXXWXXuXXFXXEXXyXXEXXrXXαXXuXpXXK…...
最新Sublime Text软件安装包分享(汉化版本)
Sublime Text 是一款广受欢迎的跨平台文本编辑器,专为代码、标记和散文编辑而设计。它以其简洁的用户界面、强大的功能和高性能而著称,深受开发者和写作者的喜爱。 一、下载地址 链接:https://pan.baidu.com/s/1kErSkvc7WnML7fljQZlcOg?pwdk…...
AI-智能体基础设施
个性化记忆需要世界模型来协助构建 业界有一个精简的Agent表达公示,即:Agent大模型(LLM)记忆(Memory)主动规划(Planning)工具使用(Tool Use)。基于该公式&am…...
【docker】docker启动neo4j,并配置内存
注意下:--volume宿主机目录:/data 和 --publish宿主机port:7474 --publish宿主机port:7687 docker run -d \ --publish9801:7474 --publish9802:7687 \ --env NEO4J_AUTHneo4j/passwd \ --volume/opt/docker/data/vol-data/neo4j4.2:/data \ --restart always \ --…...
面试准备记录
6月26日 今日学习 MySQL的1-7题(中期报告,加上玩了游戏,就没有认真背题) 6月25日 今日复习 JVM的内存管理部分(1-31题) 6月24日 今日学习 类的生命周期?类加载过程?类加载器有…...
文件管理—linux(基础IO)
目录 编辑 一、C语言文件接口(库函数) hello.c写文件 hello.c读文件 输出信息到显示器 stdin & stdout & stderr 二、系统文件I/O(系统调用) hello.c 写文件: hello.c读文件 接口介绍 open open…...
【华为OD机试|01】最远足迹(Java/C/Py/JS)
目录 一、题目介绍 1.1 题目描述 1.2 备注: 1.3 输入描述 1.4 输出描述 1.5 用例 二、Java代码实现 2.1 实现思路 2.2 详细代码 2.3 代码讲解: 三、C语言实现 3.1实现步骤 3.2 实现代码 3.3 代码详解 四、Python实现 4.1 实现步骤 4.2 …...
conda安装管理配置
原文链接:conda管理配置 导言 安装卸载 卸载 卸载 docker sudo rm -r /opt/anaconda3 #conda安装位置安装 从镜像archive中下载sh脚本安装 bash ./software/Anaconda3-2024.02-1-Linux-x86_64.sh -b -p /opt/anaconda3 #conda安装位置管理 查看 conda --ver…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
