11.MySQL事务管理详解
MySQL事务管理详解
文章目录
MySQL事务管理
事务的概念
事务的版本支持
事务的提交方式
事务的相关演示
事务的隔离级别
查看与设置隔离级别
读未提交(Read Uncommitted)
读提交(Read Committed)
可重复读(Repeatable Read)
串行化(Serializable)
隔离级别总结
关于一致性
多版本并发控制
记录中的3个隐藏字段
undo日志
快照的概念
Read View
RR与RC的本质区别
MySQL事务管理
事务的概念
事务是数据库操作的基本单位,由一条或多条SQL语句组成。这些语句在逻辑上紧密关联,共同完成一个特定任务。比如银行转账场景:从A账户扣除金额、向B账户增加金额,这两个操作必须同时成功或失败,否则就会出现数据不一致的问题。
事务的核心特性是ACID:
- 原子性(Atomicity):事务内的操作要么全部完成,要么全部不完成。如果中间某个步骤失败,整个事务会回滚到初始状态。
- 一致性(Consistency):事务执行前后,数据库的完整性约束(如主键、外键)必须保持有效。
- 隔离性(Isolation):多个事务并发执行时,彼此之间互不干扰,避免数据混乱。
- 持久性(Durability):一旦事务提交,对数据的修改就是永久的,即使系统崩溃也不会丢失。
为什么需要事务?试想如果没有事务,当执行到转账的第二步时服务器突然宕机,A账户的钱被扣了但B账户没收到,这会导致严重的资金错误。事务的出现就是为了简化开发者的编程模型,让数据库自动处理这些复杂场景。
事务的版本支持
MySQL的事务支持依赖于存储引擎。通过SHOW ENGINES
命令可以看到不同引擎的特性:
mysql> SHOW ENGINES;
+--------------------+---------+--------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+--------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, etc. | YES | YES | YES |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
+--------------------+---------+--------------------------------------------------+--------------+------+------------+
关键字段解读:
- Transactions:是否支持事务。InnoDB支持,而MyISAM不支持。
- XA:是否支持分布式事务(跨多个数据库的事务)。
- Savepoints:是否支持保存点(事务内可回滚到某个中间状态)。
因此,如果需要事务功能,必须选择InnoDB引擎。这也是MySQL默认使用InnoDB的原因之一。
事务的提交方式
事务的提交分为两种模式:
- 自动提交(Auto-commit):每条SQL语句单独作为一个事务,执行完立即提交。
- 手动提交(Manual commit):通过
BEGIN
或START TRANSACTION
显式开启事务,直到执行COMMIT
或ROLLBACK
才会结束。
查看当前提交模式:
mysql> SHOW VARIABLES LIKE 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
切换提交模式:
SET autocommit = 0; -- 关闭自动提交(手动模式)
SET autocommit = 1; -- 开启自动提交(默认模式)
手动事务示例:
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 或 ROLLBACK;
如果在执行过程中发生错误(如网络中断),未提交的事务会自动回滚,确保数据安全。
事务的相关演示
准备测试表
创建一个银行用户表:
CREATE TABLE bank_users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),balance DECIMAL(10,2)
);
插入初始数据:
INSERT INTO bank_users (name, balance) VALUES ('张三', 1000);
演示一:事务的常规操作
-
开启事务:
START TRANSACTION;
-
插入数据:
INSERT INTO bank_users (name, balance) VALUES ('李四', 500);
-
查看未提交的数据:
在另一个终端执行:SELECT * FROM bank_users; -- 可能看不到李四的记录(取决于隔离级别)
-
回滚操作:
ROLLBACK;
-
验证数据回滚:
SELECT * FROM bank_users; -- 李四的记录消失
演示二:原子性
假设事务中执行两条SQL:
START TRANSACTION;
UPDATE bank_users SET balance = balance - 1000 WHERE id = 1; -- 超出余额
UPDATE bank_users SET balance = balance + 1000 WHERE id = 2;
COMMIT;
如果第一条SQL导致余额为负数(违反业务规则),整个事务会回滚,确保数据一致性。
演示三:持久性
提交后的事务即使遇到服务器宕机,数据也不会丢失。例如:
START TRANSACTION;
UPDATE bank_users SET balance = balance + 100 WHERE id = 1;
COMMIT; -- 数据持久化到磁盘
事务的隔离级别
四种隔离级别对比
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
读未提交(Read Uncommitted) | ✅ | ✅ | ✅ | ❌ |
读已提交(Read Committed) | ❌ | ✅ | ✅ | ❌ |
可重复读(Repeatable Read) | ❌ | ❌ | ❌ | ❌ |
串行化(Serializable) | ❌ | ❌ | ❌ | ✅ |
选择建议:
- 读未提交:几乎不用,数据混乱。
- 读已提交:Oracle默认级别,适合对一致性要求不高的场景。
- 可重复读:MySQL默认级别,平衡性能与一致性。
- 串行化:极端场景使用,性能差。
查看与设置隔离级别
查看全局/会话隔离级别:
SELECT @@global.tx_isolation; -- 全局
SELECT @@session.tx_isolation; -- 当前会话
设置隔离级别:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
多版本并发控制(MVCC)
记录中的3个隐藏字段
InnoDB的每条记录包含以下隐藏字段:
- DB_TRX_ID:6字节,最近修改该记录的事务ID。
- DB_ROW_ID:6字节,隐式自增主键。
- DB_ROLL_PTR:7字节,回滚指针,指向undo日志中的历史版本。
示例:插入一条记录后:
INSERT INTO students (name, age) VALUES ('王五', 20);
该记录的DB_TRX_ID
为当前事务ID,DB_ROLL_PTR
为NULL
(无历史版本)。
undo日志
undo日志用于事务回滚和MVCC。当事务修改数据时:
- 先将旧版本拷贝到undo log。
- 更新记录的
DB_TRX_ID
和DB_ROLL_PTR
。 - 提交后释放锁。
版本链形成:每次修改都会生成新版本,通过DB_ROLL_PTR
串联成链表。
Read View
Read View是事务进行快照读时生成的可见性视图,包含:
- m_ids:活跃事务ID列表。
- m_up_limit_id:最小活跃事务ID。
- m_low_limit_id:下一个待分配的事务ID。
- m_creator_trx_id:创建该View的事务ID。
可见性判断规则:
- 事务ID <
m_up_limit_id
:可见。 - 事务ID >=
m_low_limit_id
:不可见。 - 事务ID在两者之间且不在
m_ids
中:可见。
RR与RC的本质区别
- RR(可重复读):事务第一次快照读生成Read View,后续读复用该View,保证多次读取结果一致。
- RC(读已提交):每次快照读生成新的Read View,因此可能读到其他事务已提交的修改。
示例:
- 事务A修改数据并提交。
- 事务B在事务A提交前进行快照读,则RR下看不到修改,RC下能看到。
关于一致性
一致性是事务的最终目标,依赖原子性、隔离性和持久性共同保障。例如转账场景中:
- 原子性确保要么全部成功,要么全部失败。
- 隔离性防止其他事务看到中间状态(如A扣款后B未到账)。
- 持久性保证提交后数据永久保存。
如果业务逻辑存在漏洞(如未检查余额),一致性仍会被破坏,因此开发者需自行验证业务规则。
隔离级别总结
隔离级别 | 性能 | 安全性 | 适用场景 |
---|---|---|---|
读未提交 | 高 | 低 | 无需准确性,如统计分析 |
读已提交 | 中高 | 中 | 一般业务,如订单查询 |
可重复读 | 中 | 高 | 核心业务,如银行交易 |
串行化 | 低 | 最高 | 极端场景,如库存扣减 |
选择时需权衡性能与安全性,大多数场景推荐使用可重复读。
相关文章:
11.MySQL事务管理详解
MySQL事务管理详解 文章目录 MySQL事务管理 事务的概念 事务的版本支持 事务的提交方式 事务的相关演示 事务的隔离级别 查看与设置隔离级别 读未提交(Read Uncommitted) 读提交(Read Committed) 可重复读(Repeatabl…...

前端实现视频/直播预览
有一个需求:后端返回视频的预览地址,不仅要支持这个视频的预览,还需要设置视频封面。 这里有两种情况: 如果是类似.mp4,.mov等格式的视频可以选用原生 video 进行视频展示,并且原生的 video 也支持全屏、…...

React源码阅读-fiber核心构建原理
React源码阅读(2)-fiber核心构建原理 好的,我明白了。您提供的文本主要介绍了 React 源码中 Fiber 核心的构建原理,涵盖了从执行上下文到构建、提交、调度等关键阶段,以及相关的代码实现。 您提出的关联问题也很重要,它们深入探讨…...

视频监控管理平台EasyCVR与V4分析网关对接后告警照片的清理优化方案
一、问题概述 在安防监控、设备运维等场景中,用户将视频监控管理平台EasyCVR与V4网关通过http推送方式协同工作时,硬件盒子上传的告警图片持续累积,导致EasyCVR服务器存储空间耗尽,影响系统正常运行与告警功能使用。 二、解决方…...
基于 BGE 模型与 Flask 的智能问答系统开发实践
基于 BGE 模型与 Flask 的智能问答系统开发实践 一、前言 在人工智能快速发展的今天,智能问答系统成为了提升信息检索效率和用户体验的重要工具。本文将详细介绍如何利用 BGE(Base General Embedding)模型、Faiss 向量检索库以及 Flask 框架…...

机器学习:决策树和剪枝
本文目录: 一、决策树基本知识(一)概念(二)决策树建立过程 二、决策树生成(一)ID3决策树:基于信息增益构建的决策树。(二)C4.5决策树(三ÿ…...

vscode自定义主题语法及流程
vscode c/c 主题 DIY 启用自己的主题(最后步骤) 重启生效 手把手教你制作 在C:\Users\jlh.vscode\extensions下自己创建一个文件夹 里面有两个文件一个文件夹 package.json: {"name":"theme-jlh","displayName":"%displayName%&qu…...

vue中加载Cesium地图(天地图、高德地图)
目录 1、将下载的Cesium包移动至public下 2、首先需要将Cesium.js和widgets.css文件引入到 3、 新建Cesium.js文件,方便在全局使用 4、新建cesium.vue文件,展示三维地图 1、将下载的Cesium包移动至public下 npm install cesium后 2、…...

SpringBoot整合RocketMQ与客户端注意事项
SpringBoot整合RocketMQ 引入依赖(5.3.0比较稳定) <dependencies><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.3.1</version&…...
Github 2025-06-04 C开源项目日报 Top7
根据Github Trendings的统计,今日(2025-06-04统计)共有7个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目7C++项目1Assembly项目1jq:轻量灵活的命令行JSON处理器 创建周期:4207 天开发语言:C协议类型:OtherStar数量:27698 个Fork数量:1538 …...
大二下期末
一.Numpy(Numerical Python) Numpy库是Python用于科学计算的基础包,也是大量Python数学和科学计算包的基础。不少数据处理和分析包都是在Numpy的基础上开发的,如后面介绍的Pandas包。 Numpy的核心基础是ndarray(N-di…...
LeetCode 热题 100 74. 搜索二维矩阵
LeetCode 热题 100 | 74. 搜索二维矩阵 大家好,今天我们来解决一道经典的算法题——搜索二维矩阵。这道题在 LeetCode 上被标记为中等难度,要求我们在一个满足特定条件的二维矩阵中查找一个目标值。如果目标值在矩阵中,返回 true;…...
解决 VSCode 中无法识别 Node.js 的问题
当 VSCode 无法识别 Node.js 时,通常会出现以下症状: 代码提示缺失require 等 Node.js API 被标记为错误调试功能无法正常工作终端无法运行 Node.js 命令 常见原因及解决方案 1. Node.js 未安装或未正确配置 解决方法: 确保已安…...

Mysql的卸载与安装
确保卸载干净mysql 不然在进行mysal安装时候会出现不一的页面和问题 1、卸载 在应用页面将查询到的mysql相关应用卸载 2、到c盘下将残留的软件包进行数据删除 3、删除programData下的mysql数据 4、检查系统中的mysql是否存在 cmd中执行 sc deleted mysql80 5、删除注册表中的…...
ES101系列09 | 运维、监控与性能优化
本篇文章主要讲解 ElasticSearch 中 DevOps 与性能优化的内容,包括集群部署最佳实践、容量规划、读写性能优化和缓存、熔断器等。 集群部署最佳实践 在生产环境中建议设置单一角色的节点。 Dedicated master eligible nodes:负责集群状态的管理。使用…...
Java常用的判空方法
文章目录 Java常用的判空方法JDK 自带的判空方法1. 使用 或 ! 运算符2. 使用 equals 方法3. Objects.isNull / Objects.nonNull4. Objects.equals4. JDK8 中的 Optional 第三方工具包1. Apache Commons Lang32. Google Guava3. Lombok 注解4. Vavr(函数式风格&…...

Excel处理控件Aspose.Cells教程:使用 C# 在 Excel 中创建组合图表
可视化项目时间线对于有效规划和跟踪至关重要。在本篇教程中,您将学习如何使用 C# 在 Excel 中创建组合图。只需几行代码,即可自动生成动态、美观的组合图。无论您是在构建项目管理工具还是处理内部报告,本指南都将向您展示如何将任务数据转换…...

【多线程初阶】阻塞队列 生产者消费者模型
文章目录 一、阻塞队列二、生产者消费者模型(一)概念(二)生产者消费者的两个重要优势(阻塞队列的运用)1) 解耦合(不一定是两个线程之间,也可以是两个服务器之间)2) 削峰填谷 (三)生产者消费者模型付出的代价 三、标准库中的阻塞队列(一)观察模型的运行效果(二)观察阻塞效果1) 队…...

《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》
目录 一、踏上Python之旅二、Python输入与输出三、变量与基本数据类型四、运算符五、流程控制 一、踏上Python之旅 1.想要输出 I Love Python,应该使用()函数。 A.printf() B.print() C.println() D.Print() 在Python中想要在屏幕中输出内容,应该使用print()函数…...

机器人夹爪的选型与ROS通讯——机器人抓取系统基础系列(六)
文章目录 前言一、夹爪的选型1.1 任务需求分析1.2 软体夹爪的选型 二、夹爪的ROS通讯2.1 夹爪的通信方式介绍2.2 串口助手测试2.3 ROS通讯节点实现 总结Reference: 前言 本文将介绍夹爪的选型方法和通讯方式。以鞋子这类操作对象为例,将详细阐述了对应的夹爪选型过…...

第二十八章 RTC——实时时钟
第二十八章 RTC——实时时钟 目录 第二十八章 RTC——实时时钟 1 RTC实时时钟简介 2 RTC外设框图剖析 3 UNIX时间戳 4 与RTC控制相关的库函数 4.1 等待时钟同步和操作完成 4.2 使能备份域涉及RTC配置 4.3 设置RTC时钟分频 4.4 设置、获取RTC计数器及闹钟 5 实时时…...

使用 DuckLake 和 DuckDB 构建 S3 数据湖实战指南
本文介绍了由 DuckDB 和 DuckLake 组成的轻量级数据湖方案,旨在解决传统数据湖(如HadoopHive)元数据管理复杂、查询性能低及厂商锁定等问题。该方案为中小规模数据湖场景提供了简单、高性能且无厂商锁定的替代选择。 1. 什么是 DuckLake 和 D…...

大语言模型提示词(LLM Prompt)工程系统性学习指南:从理论基础到实战应用的完整体系
文章目录 前言:为什么提示词工程成为AI时代的核心技能一、提示词的本质探源:认知科学与逻辑学的理论基础1.1 认知科学视角下的提示词本质信息处理理论的深层机制图式理论的实际应用认知负荷理论的优化策略 1.2 逻辑学框架下的提示词架构形式逻辑的三段论…...

如何基于Mihomo Party http端口配置git与bash命令行代理
如何基于Mihomo Party http端口配置git与bash命令行代理 1. 确定Mihomo Party http端口配置 点击内核设置后即可查看 默认7892端口,开启允许局域网连接 2. 配置git代理 配置本机代理可以使用 127.0.0.1 配置局域网内其它机代理需要使用本机的非回环地址 IP&am…...
CMake 为 Debug 版本的库或可执行文件添加 d 后缀
在使用 CMake 构建项目时,我们经常需要区分 Debug 和 Release 构建版本。一个常见的做法是为 Debug 版本的库或可执行文件添加后缀(如 d),例如 libmylibd.so 或 myappd.exe。 本文将介绍几种在 CMake 中实现为 Debug 版本自动添加 d 后缀的方法。 方法一:使用 CMAKE_DEBU…...
Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit
Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit 在Linux权限系统中,除了基本的读、写(w)、执行(x)权限外,还有三个特殊权限位:SetUID、SetGID和Sticky Bit。这些权限位提供了更精细的权限控制机制,尤其在需要临时提升权限或管理共享资源时非常有用。 一、SetUID (s位…...

埃文科技智能数据引擎产品入选《中国网络安全细分领域产品名录》
嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,埃文科技智能数据引擎产品成功入选数据分级分类产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解这一蓬勃发展的产业格局,嘶吼安全产业…...
使用VTK还是OpenGL集成到qt程序里哪个好?
在Qt程序中集成VTK与OpenGL:选择哪个更好? 在Qt程序中实现三维可视化时,开发者常常面临一个选择:是使用VTK(Visualization Toolkit)还是OpenGL(Open Graphics Library)。这两种技术…...
Java-IO流之打印流详解
Java-IO流之打印流详解 一、打印流概述1.1 什么是打印流1.2 打印流的特点1.3 打印流的应用场景 二、PrintStream详解2.1 基本概念2.2 构造函数2.3 核心方法2.4 使用示例 三、PrintWriter详解3.1 基本概念3.2 构造函数3.3 核心方法3.4 使用示例 四、PrintStream与PrintWriter的比…...
高效图像处理:使用 Pillow 进行格式转换与优化
高效图像处理:使用 Pillow 进行格式转换与优化 1. 背景引入 在图像处理应用中,格式转换、裁剪、压缩等操作是常见需求。Python 的 Pillow 库基于 PIL(Python Imaging Library),提供 轻量、强大 的图像处理能力,广泛用于 Web 开发、数据分析、机器学习 等领域。 本文将…...