当前位置: 首页 > article >正文

深入理解 MySQL 事务:从基础到实战,一篇吃透

在开发和运维 MySQL 数据库的过程中事务Transaction是绕不开的核心知识点它是保证数据库数据安全、一致、可靠的基石。无论是电商下单、银行转账、支付结算还是日常的业务数据操作都离不开事务的支撑。这篇文章会从事务的定义、四大特性ACID、隔离级别、并发问题、事务语法、实战案例、底层原理等维度把 MySQL 事务讲得明明白白新手也能轻松看懂、直接用。一、什么是 MySQL 事务简单来说事务是一组不可分割的数据库操作集合要么全部执行成功要么全部执行失败不会出现中间状态。举个最经典的例子银行转账A 账户给 B 账户转 100 元数据库需要执行两步操作A 账户扣 100 元B 账户加 100 元这两步必须同时成功或者同时失败如果 A 扣钱了、B 没加钱 → 数据错乱用户损失如果 A 没扣钱、B 加钱了 → 银行损失事务就是用来杜绝这种中间状态保证数据绝对可靠。二、事务的四大特性ACID事务的核心就是ACID 四大特性这是面试必问、开发必懂的知识点。1. 原子性Atomicity定义事务是最小的执行单位不可分割。事务中的所有 SQL要么全部执行成功要么全部回滚撤销。只要有一步失败整个事务都作废数据回到执行前的状态。2. 一致性Consistency定义事务执行前后数据库的完整性约束不被破坏。转账前后A 和 B 的总金额不变。数据始终符合业务规则不会出现非法、错乱的数据。3. 隔离性Isolation定义多个事务并发执行时互相不干扰一个事务的中间状态对其他事务不可见。隔离性通过事务隔离级别实现后面会详细讲。4. 持久性Durability定义一旦事务提交成功对数据的修改是永久的。即使数据库宕机、重启数据也不会丢失。依靠 MySQL 的 redo log 实现持久化。三、事务的并发问题不隔离会怎样如果多个事务同时操作同一份数据不做隔离会出现 4 种经典问题1. 脏读Dirty Read一个事务读取到了另一个未提交事务修改的数据。例子事务 1 修改数据但未提交事务 2 读到了这个临时数据结果事务 1 回滚了 → 事务 2 读到的是 “脏数据”。2. 不可重复读Non-Repeatable Read一个事务内多次读取同一行数据结果不一致。原因其他事务在这期间修改并提交了这行数据。3. 幻读Phantom Read一个事务内多次查询的结果集行数不一致。原因其他事务在这期间插入 / 删除了符合条件的数据。4. 丢失更新Lost Update两个事务同时修改同一数据后提交的事务覆盖了先提交的修改。四、事务的四大隔离级别MySQL 提供了4 种隔离级别用来解决上面的并发问题级别从低到高隔离级别脏读不可重复读幻读性能读未提交READ UNCOMMITTED✅ 允许✅ 允许✅ 允许最高读已提交READ COMMITTED❌ 禁止✅ 允许✅ 允许高可重复读REPEATABLE READ❌ 禁止❌ 禁止⚠️ 部分解决中串行化SERIALIZABLE❌ 禁止❌ 禁止❌ 禁止最低重点说明MySQL 默认隔离级别可重复读REPEATABLE READInnoDB 存储引擎在可重复读级别下通过MVCC 间隙锁基本解决了幻读问题。隔离级别越高数据越安全但并发性能越差。生产环境推荐使用读已提交 或 可重复读。五、MySQL 事务基本语法1. 开启事务START TRANSACTION; -- 或者简写 BEGIN;2. 提交事务永久生效COMMIT;3. 回滚事务撤销所有操作ROLLBACK;4. 设置事务隔离级别-- 会话级别当前连接生效 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 全局级别所有新连接生效 SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;5. 查看当前隔离级别SELECT transaction_isolation;六、实战案例银行转账事务完整演示1. 创建测试表CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), balance DECIMAL(10,2) ); INSERT INTO account(name, balance) VALUES (张三, 1000.00), (李四, 1000.00);2. 正常转账提交事务-- 开启事务 BEGIN; -- 1. 张三扣 100 UPDATE account SET balance balance - 100 WHERE name 张三; -- 2. 李四加 100 UPDATE account SET balance balance 100 WHERE name 李四; -- 确认无误提交 COMMIT;执行后张三 900李四 1100 ✅3. 异常转账回滚事务BEGIN; UPDATE account SET balance balance - 100 WHERE name 张三; -- 模拟异常比如程序报错、网络中断 -- 直接回滚所有操作作废 ROLLBACK;执行后数据回到原来的状态没有任何修改✅七、事务的底层原理进阶想真正吃透事务必须了解它的底层实现机制1. redo log重做日志保证持久性记录 “修改了什么数据”数据库宕机重启后通过 redo log 恢复数据2. undo log回滚日志保证原子性记录修改前的数据事务回滚时用 undo log 恢复数据3. MVCC多版本并发控制保证隔离性实现无锁读写提升并发性能是 MySQL 高效处理并发事务的核心八、事务使用注意事项生产必看事务要短小精悍不要在事务里执行耗时操作远程调用、sleep、大量计算否则会导致锁等待、性能暴跌。避免长事务长事务会占用大量 undo log导致数据库性能下降。所有更新操作必须加事务尤其是涉及多表、多行的业务逻辑。不要自动提交生产环境建议关闭自动提交SET autocommit 0;异常必须回滚程序捕获异常时一定要执行ROLLBACK。九、总结事务一组操作要么全成要么全败。ACID原子性、一致性、隔离性、持久性事务的灵魂。并发问题脏读、不可重复读、幻读、丢失更新。隔离级别MySQL 默认可重复读兼顾安全与性能。核心命令BEGIN→ 执行 SQL →COMMIT/ROLLBACK。底层redo log、undo log、MVCC 共同支撑事务。掌握 MySQL 事务你就能写出安全、稳定、高并发的数据库程序这是后端开发的核心基本功。

相关文章:

深入理解 MySQL 事务:从基础到实战,一篇吃透

在开发和运维 MySQL 数据库的过程中,事务(Transaction) 是绕不开的核心知识点,它是保证数据库数据安全、一致、可靠的基石。无论是电商下单、银行转账、支付结算,还是日常的业务数据操作,都离不开事务的支撑…...

nlp_structbert_sentence-similarity_chinese-large保姆级教学:模型路径自定义、多模型切换、Web界面汉化配置

nlp_structbert_sentence-similarity_chinese-large保姆级教学:模型路径自定义、多模型切换、Web界面汉化配置 1. 引言:为什么需要这个工具? 你是不是经常遇到这样的情况:需要判断两段中文文字是不是表达同一个意思,…...

电子工程师职业发展:技术深度与行业视野的平衡

1. 电子工程师的职业困境与突破路径作为一名在电子行业摸爬滚打十余年的老兵,我见过太多才华横溢的同行最终陷入职业瓶颈。有趣的是,阻碍我们发展的往往不是技术本身,而是那些容易被忽视的"软性因素"。记得刚入行时,我也…...

别再只数步数了!深入聊聊ADXL345计步算法里的‘动态阈值’与‘最活跃轴’

别再只数步数了!深入聊聊ADXL345计步算法里的‘动态阈值’与‘最活跃轴’ 当你盯着智能手环上的步数统计时,有没有想过这串数字背后藏着怎样的算法智慧?ADXL345作为一款经典的三轴加速度传感器,其计步算法远非简单的阈值比较那么简…...

Google 地图事件:探索、挑战与未来展望

Google 地图事件:探索、挑战与未来展望 引言 Google 地图作为全球最受欢迎的地图服务之一,自2005年推出以来,已经深入到人们生活的方方面面。然而,在这段时间里,Google 地图也经历了一系列事件,包括技术挑战、政策争议以及市场竞争等。本文将围绕这些事件,对 Google 地…...

ArchLinux新手必看:用Fcitx5搞定中文输入,从安装到美化皮肤保姆级教程

ArchLinux新手必看:用Fcitx5搞定中文输入,从安装到美化皮肤保姆级教程 刚接触ArchLinux的新手们,面对命令行界面时总会有些手足无措。特别是当需要输入中文时,如何配置一个既美观又实用的输入法成了许多人的第一个挑战。Fcitx5作…...

使用ZLMRTCClient.j实现webRtc流播放

1. 核心播放器组件封装 (WebRTCPlayer.vue)为了在项目中复用播放逻辑,我们首先封装一个 WebRTCPlayer 组件。该组件主要负责:初始化播放器实例:配置 ZLMRTCClient.Endpoint。处理自动播放:解决浏览器禁止带音频自动播放的问题。生…...

Realistic Vision V5.1 提示词工程入门:C语言基础思维在Prompt编写中的应用

Realistic Vision V5.1 提示词工程入门:C语言基础思维在Prompt编写中的应用 如果你有C语言的编程经验,现在想玩转AI图像生成,特别是像Realistic Vision V5.1这样的写实风格模型,那这篇文章就是为你准备的。很多人觉得写提示词&am…...

PyTorch 2.8镜像快速部署:5分钟验证torch.cuda.is_available()并启动API服务

PyTorch 2.8镜像快速部署:5分钟验证torch.cuda.is_available()并启动API服务 1. 镜像概述与环境准备 PyTorch 2.8深度学习镜像是一个开箱即用的高性能计算环境,专为现代AI工作负载优化。这个预配置环境能让你跳过繁琐的安装过程,直接进入模…...

从make clean到build.prop:揭秘Android系统属性生成的完整链条

从make clean到build.prop:揭秘Android系统属性生成的完整链条 当你通过adb shell getprop ro.build.display.id查看设备版本号时,是否好奇过这个字符串背后的生成逻辑?在Android编译系统中,从Makefile执行到最终生成build.prop文…...

MDXEditor指令系统详解:如何扩展Markdown语法

MDXEditor指令系统详解:如何扩展Markdown语法 【免费下载链接】editor A rich text editor React component for markdown 项目地址: https://gitcode.com/gh_mirrors/editor/editor MDXEditor是一个功能丰富的React组件,专为Markdown编辑设计&am…...

安规设计规范-3(如何计算电气间隙和爬电距离)

详尽的计算方式建议参考各个标准的要求,本文只指出常规的基础计算流程。以下示例严格遵循 GB/T 16935.1-2023/IEC 60664-1:2020《低压系统内设备的绝缘配合》,选用储能 PCS(储能变流器)最常见的230V AC 电网侧对低压控制侧场景&am…...

Tomato Novel Downloader:智能搜索功能的技术突破

Tomato Novel Downloader:智能搜索功能的技术突破 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读工具领域,用户体验的每一个细节都可能决定…...

毕业设计实战:基于Java+MySQL的教务管理系统设计与实现指南

毕业设计实战:基于JavaMySQL的教务管理系统设计与实现指南 在开发“基于JavaMySQL的教务管理系统”毕业设计时,曾因课程报名表未通过学生ID与课程ID双外键关联踩过关键坑——初期仅设计报名编号、报名时间等基础字段,未与学生表、课程表建立关…...

毕业设计实战:基于SSM+JSP的家纺用品销售管理系统设计与实现全攻略

毕业设计实战:基于SSMJSP的家纺用品销售管理系统设计与实现全攻略 在开发“家纺用品销售管理系统”这套毕设时,我曾因“订单管理与商家库存脱节”踩过一个关键坑。初期设计时,我将“用户下单”和“商家库存扣减”视为两个独立操作&#xff0c…...

Arduino_Threads:Mbed OS平台的嵌入式多线程实践框架

1. Arduino_Threads 库深度解析:面向 Mbed OS 的嵌入式多线程实践框架1.1 库定位与工程价值Arduino_Threads 是 Arduino 官方为基于 Mbed OS 核心的 Arduino 开发板(如 Nano RP2040 Connect、Portenta H7、Nicla Sense ME 等)设计的轻量级多线…...

AutoGen Studio效果展示:看Qwen3-4B如何协作完成网页设计

AutoGen Studio效果展示:看Qwen3-4B如何协作完成网页设计 1. AutoGen Studio简介 AutoGen Studio是一个基于微软AutoGen框架开发的低代码界面工具,它让构建和组合AI代理变得简单直观。通过这个平台,你可以快速创建多个AI代理,为…...

HuggingFace大语言模型实战:如何用Python脚本批量翻译YouTube字幕(含环境配置避坑指南)

HuggingFace大语言模型实战:Python脚本批量翻译YouTube字幕全攻略 当你在YouTube上发现一段精彩的英文技术讲座,或是需要研究某个外语行业报告时,自动翻译工具能大幅提升信息获取效率。本文将带你用HuggingFace生态构建一个本地化翻译工作流&…...

OpCore-Simplify:让OpenCore EFI配置变得智能高效

OpCore-Simplify:让OpenCore EFI配置变得智能高效 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 问题引入:为什么Hackintosh配…...

Joy-Con Toolkit终极指南:快速解锁Switch手柄隐藏功能

Joy-Con Toolkit终极指南:快速解锁Switch手柄隐藏功能 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款专为任天堂Switch手柄设计的开源控制软件,为游戏玩家提供前所…...

4个核心功能实现智能散热:FanControl个性化温控指南

4个核心功能实现智能散热:FanControl个性化温控指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…...

Python内存管理策略对比评测报告(2024权威版):仅1种策略通过了金融级SLA压力测试,其余4种已淘汰

第一章:Python智能体内存管理策略对比评测报告(2024权威版)概述Python智能体(如基于LLM的Agent框架、自主任务调度器、多步推理引擎)在运行过程中面临高频对象创建、长生命周期缓存、跨线程引用共享等复杂内存场景。传…...

【JDK21虚拟线程生产就绪 checklist】:8类典型场景配置模板(WebFlux/Quarkus/Vert.x/RSocket全覆盖)

第一章:JDK21虚拟线程核心机制与生产就绪定义虚拟线程(Virtual Threads)是 JDK 21 中正式引入的里程碑特性(JEP 444),其本质是轻量级、用户态调度的 Java 线程抽象,由 JVM 在平台线程&#xff0…...

2026年高压电磁阀制造厂大比拼:哪家更值得信赖?

在工业领域,高压电磁阀是许多关键系统的核心部件,其性能和可靠性直接关系到整个系统的稳定性和安全性。随着技术的不断进步和市场需求的多样化,选择一家值得信赖的高压电磁阀制造厂变得尤为重要。本文将从多个维度对比分析几家主流高压电磁阀…...

Matlab源代码教程:枝晶生长模拟中的溶质与液相分数分析

枝晶生长模拟,溶质、液相分数,matlab源代码 教程相场法模拟枝晶生长这事挺有意思的——想象金属熔液凝固时,那些像雪花般绽放的晶体结构,背后其实是溶质扩散和相变的战场。今儿咱们用MATLAB整活,搞个能看见晶体长毛刺的…...

HiOmics平台:零代码实现ChIP-Seq数据可视化与深度解析

1. 为什么科研人员需要零代码ChIP-Seq分析工具 做表观遗传学研究的朋友们应该都深有体会,ChIP-Seq数据分析就像一场马拉松——从原始数据清洗、序列比对、peak calling到功能注释,每个环节都需要不同的工具和脚本。我刚开始接触这个领域时,光…...

保姆级教程:NotaGen一键部署,小白也能生成贝多芬风格交响乐

保姆级教程:NotaGen一键部署,小白也能生成贝多芬风格交响乐 1. 引言:AI音乐创作新体验 你是否曾经梦想过创作一首属于自己的交响乐?现在,NotaGen让这个梦想变得触手可及。这个基于大语言模型(LLM)的音乐生成工具&…...

Nunchaku FLUX.1-dev GPU算力优化:TensorRT加速推理实测对比

Nunchaku FLUX.1-dev GPU算力优化:TensorRT加速推理实测对比 如果你正在使用Nunchaku FLUX.1-dev模型生成图片,可能会发现一个问题:生成速度不够快,特别是当你想批量出图或者尝试不同参数时,等待时间有点长。 今天我…...

企微API集成指南——从回调到主动发送,全流程代码解析

企业微信提供了丰富的API,用于接收用户添加事件、发送消息、管理标签等。今天从实战角度,给出API集成的最佳实践,附带伪代码。一、核心API清单API用途频率限制获取access_token调用其他API的前提2000次/分钟添加外部联系人通过好友每个号300人…...

单片机调试:问题复现与定位的实战技巧

1. 单片机开发中的问题复现方法论在单片机项目开发过程中,遇到问题是不可避免的。作为一名从业多年的嵌入式工程师,我认为问题复现是整个调试过程中最关键的第一步。很多新手开发者常常急于解决问题,却忽略了问题复现的重要性,结果…...