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

【MySQL】第五节 - 事务实战详解:从基础到并发控制(附 Navicat 可运行实验脚本)

《MySQL 事务实战详解从基础到并发控制附 Navicat 可运行实验脚本》为什么你必须掌握 MySQL 事务在现代应用系统中数据一致性是核心诉求。事务Transaction是保证数据完整性的“黄金标准”。无论是银行转账、库存扣减、订单创建还是用户积分变动事务机制都在默默守护数据安全。本文将带你从零开始手把手用 Navicat 演示所有核心知识点并附带可直接复制粘贴运行的实验脚本让你“边学边练”真正理解事务的本质。一、什么是事务——数据库中的“原子操作单元”事务是一组数据库操作SQL 语句的集合它们作为一个整体被执行要么全部成功要么全部失败回滚。1. 事务的四大特性ACID特性说明示例A - 原子性Atomicity事务中的所有操作必须全部完成不能“部分提交”张三转 1000 元给李四若李四没到账张三也要退回C - 一致性Consistency事务前后数据库必须保持一致性状态总金额不变张三减 1000李四加 1000I - 隔离性Isolation多个事务并发执行时互不干扰一个事务不可读到另一个事务未提交的数据D - 持久性Durability事务一旦提交结果永久保存即使系统崩溃数据也不会丢失理解 ACID你才算真正掌握了“事务为什么重要”。二、如何使用事务——MySQL 两种模式模式一手动控制事务推荐用于复杂逻辑-- 1. 关闭自动提交设置为手动SETautocommit0;-- 2. 开启事务STARTTRANSACTION;-- 3. 执行多个 SQL 操作UPDATEaccountSETmoneymoney-1000WHEREname张三;UPDATEaccountSETmoneymoney1000WHEREname李四;-- 4. 查看结果此时仍可回滚SELECT*FROMaccountWHEREnameIN(张三,李四);-- 5. 成功提交事务COMMIT;-- 6. 失败回滚事务-- ROLLBACK;模式二通过存储过程封装适合复用-- 清空旧过程DROPPROCEDUREIFEXISTStransfer;-- 创建转账存储过程DELIMITER//CREATEPROCEDUREtransfer()BEGINSTARTTRANSACTION;-- 查询余额SELECTmoneyINTObalanceFROMaccountWHEREname张三;-- 判断是否足够IFbalance100THENUPDATEaccountSETmoneymoney-100WHEREname张三;UPDATEaccountSETmoneymoney100WHEREname李四;COMMIT;SELECT✅ 转账成功ASresult;ELSEROLLBACK;SELECT❌ 余额不足已回滚ASresult;ENDIF;END//DELIMITER;-- 执行CALLtransfer();小贴士SET autocommit 1是自动提交模式默认SET autocommit 0是手动提交模式必须手动 COMMIT/ROLLBACK三、事务的隔离级别四层“防火墙”并发事务可能导致数据不一致。MySQL 提供4 种隔离级别来控制这种干扰。默认隔离级别是REPEATABLE READMySQL 8.0隔离级别是否脏读是否不可重复读是否幻读适用场景READ UNCOMMITTED✅ 是✅ 是✅ 是一般不用风险太高READ COMMITTED❌ 否✅ 是✅ 是乐观锁场景、日志系统REPEATABLE READ❌ 否❌ 否⚠️ 一般MVCC 优化推荐默认级别SERIALIZABLE❌ 否❌ 否❌ 否高度并发 高安全性性能差查看当前隔离级别SELECTtransaction_isolation;设置隔离级别-- 临时设置当前会话有效SETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;-- 或者SETSESSIONTRANSACTIONISOLATIONLEVELREPEATABLEREAD;当然可以以下是对“四大并发事务问题”的简明扼要、通俗易懂、适合发布在 CSDN 或技术博客的介绍已为你优化为清晰、结构化、可读性强的表达四、四大并发事务问题简要介绍在多用户并发操作数据库的场景下多个事务可能同时读写同一数据若没有合理控制就会引发数据不一致问题。MySQL 事务隔离级别正是为了解决这些问题而设计的。下面介绍四种最常见的并发异常一文讲清 1. 脏读Dirty Read“读到了还没提交的‘假数据’”场景事务 A 修改了数据但未提交事务 B 就读取了 A 的修改。风险如果 A 后来ROLLBACKB 读到的数据就是“虚假”的称为“脏数据”。解决方式使用READ COMMITTED或更高隔离级别。示例张三转账 100 元给李四但还没提交李四的系统立刻查余额发现到账了 —— 结果一回滚钱又没了2. 不可重复读Non-Repeatable Read“同事务内两次读同一数据结果不一样”场景事务 A 第一次读取某条记录之后事务 B 修改了这条记录并提交事务 A 再次读取发现数据变了。注意这是“数据被改了”不是新增或删除。解决方式使用REPEATABLE READ或SERIALIZABLE。示例事务 A 查询“张三余额1000”一会儿后再次查询变成“800”—— 因为别人已转走 200。3. 幻读Phantom Read“同一事务中读不到别人新增的行”场景事务 A 查询某类数据如WHERE age 18事务 B 插入一条符合条件的新数据并提交事务 A 再次查询时发现“多出了一些行”。注意不是修改了老数据而是新数据“凭空出现”。解决方式使用SERIALIZABLE或 MySQL 的间隙锁REPEATABLE READ也部分防止。示例事务 A 查询“在职员工5 人”事务 B 新增一名员工并提交事务 A 再查变成“6 人”。小知识在 MySQL 的REPEATABLE READ中通常不会出现幻读因为使用了“间隙锁”但严格意义上仍有可能。4. 补充丢失更新Lost Update虽不总列为“四大问题”但非常常见场景两个事务同时读取同一数据各自修改后都提交后提交的覆盖了先提交的。后果一次更新被“覆盖”导致数据丢失。解决方式加锁如SELECT ... FOR UPDATE 事务控制。总结对比表建议收藏问题描述出现场景隔离级别可避免脏读读到未提交数据读未提交RC✅READ COMMITTED以上不可重复读同事务内两次读不一致修改数据✅REPEATABLE READ以上幻读查询结果“凭空多出”新增/删除数据✅SERIALIZABLEMySQLRR有优化丢失更新一次修改被覆盖并发更新✅ 加锁 事务一句话口诀记忆脏读读了没提交的“假数据”不可重复读读了被改过的“变了”数据幻读读到了“凭空出现”的新数据丢失更新改了被覆盖白白努力附常见隔离级别应对效果隔离级别能防脏读能防不可重复读能防幻读READ UNCOMMITTED❌ 否❌ 否❌ 否READ COMMITTED✅ 是❌ 否❌ 否REPEATABLE READMySQL 默认✅ 是✅ 是✅部分SERIALIZABLE✅ 是✅ 是✅ 是五、四大并发问题演示Navicat 实验代码实验1读未提交Dirty Read——脏读问题-- 【窗口A】设置为读未提交SETSESSIONTRANSACTIONISOLATIONLEVELREADUNCOMMITTED;STARTTRANSACTION;UPDATEaccountSETmoneymoney-200WHEREname张三;SELECT窗口A张三余额变为 800未提交ASnote;SELECT*FROMaccountWHEREname张三;-- 【窗口B】也设为读未提交SETSESSIONTRANSACTIONISOLATIONLEVELREADUNCOMMITTED;SELECT窗口B可以读到未提交的数据ASnote;SELECT*FROMaccountWHEREname张三;-- ✅ 输出800 → 即使A没提交B也能读到实验2读已提交Read Committed-- 【窗口A】设置为读已提交SETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;STARTTRANSACTION;UPDATEaccountSETmoneymoney-100WHEREname张三;-- 【窗口B】读取此时A未提交 → 读不到SELECT窗口B不能读到未提交的数据ASnote;SELECT*FROMaccountWHEREname张三;-- 输出1000 → 未看到A的变更-- 在A窗口提交后COMMITB再查 → 就能看到新值实验3可重复读Repeatable Read——MVCC 机制-- 【窗口A】设置为可重复读SETSESSIONTRANSACTIONISOLATIONLEVELREPEATABLEREAD;STARTTRANSACTION;SELECT窗口A第一次读ASnote;SELECT*FROMaccountWHEREname张三;-- 等待【窗口B】提交修改如转100给李四-- 【窗口A】再次读SELECT窗口A第二次读仍为原值ASnote;SELECT*FROMaccountWHEREname张三;-- 输出原值即使别人提交了我也读不到这就是MySQL 的 MVCC多版本并发控制每个事务看到的是“快照”不会被其他事务干扰。实验4串行化Serializable——强制排队-- 【窗口A】设置为串行化SETSESSIONTRANSACTIONISOLATIONLEVELSERIALIZABLE;STARTTRANSACTION;SELECT窗口A读取张三余额ASnote;SELECT*FROMaccountWHEREname张三;-- 【窗口B】尝试读会被阻塞必须等A提交SETSESSIONTRANSACTIONISOLATIONLEVELSERIALIZABLE;STARTTRANSACTION;SELECT窗口B等待阻塞ASnote;SELECT*FROMaccountWHEREname张三;-- 回到A窗口执行COMMIT;-- B窗口才恢复执行串行化 “一锤定音”事务间完全互斥性能最低但最安全。五、关键工具 技巧汇总技巧说明ROLLBACK回滚事务恢复到事务开始前状态COMMIT提交事务永久保存修改SELECT autocommit;查看自动提交状态SET SESSION TRANSACTION ISOLATION LEVEL ...动态设置隔离级别DELIMITER // ... //定义存储过程边界DROP PROCEDURE IF EXISTS ...安全删除旧过程如果你觉得这篇文章对你有帮助请点赞 收藏 分享欢迎在评论区留言你遇到过的“事务坑”

相关文章:

【MySQL】第五节 - 事务实战详解:从基础到并发控制(附 Navicat 可运行实验脚本)

《MySQL 事务实战详解:从基础到并发控制(附 Navicat 可运行实验脚本)》 为什么你必须掌握 MySQL 事务? 在现代应用系统中,数据一致性是核心诉求。事务(Transaction) 是保证数据完整性的“黄金…...

PaddleOCR-VL-WEB部署避坑指南:常见问题与优化建议汇总

PaddleOCR-VL-WEB部署避坑指南:常见问题与优化建议汇总 1. 部署前的关键准备 1.1 硬件配置检查清单 在部署PaddleOCR-VL-WEB镜像前,请确保您的硬件满足以下要求: GPU型号:NVIDIA RTX 4090D是最低要求,显存必须≥24G…...

C++的std--ranges中的验证编译期

C20引入的std::ranges库彻底改变了范围操作的方式,其中编译期验证机制是其最强大的特性之一。这种机制允许开发者在编译阶段捕获潜在错误,显著提升了代码的健壮性和性能。本文将深入探讨std::ranges中编译期验证的核心机制及其实际应用价值。编译时概念检…...

QGC二次开发---多机协同任务中的智能框选与指令批量下发

1. 多机协同作业的核心痛点与解决方案 在农业植保、物流配送等需要多架无人机协同作业的场景中,操作人员经常面临一个棘手问题:如何快速选择特定区域的无人机并批量下发指令?传统方法需要逐个点击无人机图标,效率低下且容易出错。…...

GCN在推荐系统中的应用:如何用图神经网络提升电商个性化推荐效果

GCN在电商推荐系统中的实战指南:从二部图构建到A/B测试全流程 当你在电商平台浏览商品时,那些"猜你喜欢"的推荐背后,可能正运行着一套基于图神经网络(GCN)的复杂算法系统。与传统的协同过滤不同,GCN能够捕捉用户-商品交…...

别再手动测试了!教你用ThinkPHP6+Workerman/MQTT搭建一个本地MQTT消息调试台

基于ThinkPHP6与Workerman/MQTT构建物联网调试平台的完整指南 物联网开发中,MQTT协议因其轻量级和高效性成为设备通信的首选方案。但调试MQTT消息往往依赖命令行工具或第三方平台,效率低下且缺乏灵活性。本文将展示如何利用ThinkPHP6框架配合Workerman/M…...

用 Bedrock AgentCore SDK 把 OpenClaw Agent 部署到 AWS 托管运行时:从本地开发到生产上线全流程

用 Bedrock AgentCore SDK 把 OpenClaw Agent 部署到 AWS 托管运行时:从本地开发到生产上线全流程 手里有个跑得好好的 OpenClaw Agent,想搬到 AWS 上让它自动扩缩、有监控有告警?Amazon Bedrock AgentCore 就是干这个的——把任意框架的 AI …...

三种主流技术方案,实现文本差异并排对比与可视化

1. 文本差异对比的技术需求与场景分析 在代码审查、文档修订或数据比对等场景中,文本差异对比功能就像给内容做"CT扫描",能快速定位修改痕迹。我经历过多次团队协作时找不到修改点的尴尬,直到系统化地测试了三种主流技术方案。**并…...

生成单颗10mm级配的cluster骨料

PFC5.0代码,可以破碎的cluster,可模拟碎石、矿渣混凝土材料,ball与cluster颗粒,单轴压缩实验,内涵声发射事件数代码,分析统计ball与ball直接的裂纹数目,cluster内部破碎的裂纹数目上周帮同门调P…...

GinCdn内容分发系统V1.0.9更新内容

GinCdn内容分发系统GinCdn是一款基于Go语言Gin框架自研的轻量高效内容分发系统,专为中小型企业/个人搭建CDN打造,采用主控边缘节点分布式架构,实现智能调度、高效缓存、精准监控的一体化解决方案。无需复杂命令行,小白也能轻松上手…...

基于高斯过程回归的MATLAB时间序列区间预测代码实现与解析

基于高斯过程回归(GPR)的时间序列区间预测 GPR时间序列区间预测 matlab代码 暂无Matlab版本要求 -- 推荐 2018B 版本及以上做时间序列最烦的就是拍脑袋给个“明天涨3%左右”——“左右”到底是正负0.5还是正负3?如果是风电发电的负荷申报,正负差多了要罚…...

C语言编程基础与核心概念详解

1. C语言入门基础解析C语言作为编程世界的基石语言,其简洁高效的特性使其在系统编程、嵌入式开发等领域占据不可替代的地位。我第一次接触C语言是在大学计算机系的实验室里,那个打印出"Hello World"的瞬间至今记忆犹新。让我们从最基础的部分开…...

seo公司招聘的实习机会有哪些

SEO公司招聘的实习机会有哪些? 在当今数字化时代,SEO(搜索引擎优化)已经成为企业在网络上获得高流量和高曝光度的关键手段。随着越来越多的企业意识到SEO的重要性,SEO公司也在不断扩展,吸引大量优秀的实习…...

收藏!小白也能看懂的大模型推理能力训练与未来趋势深度解析

文章讨论了大模型的发展历程,从早期的“读很多书”模式到引入“思考”能力的转变。重点介绍了推理式思考与智能体式思考的区别,以及Qwen团队在模型训练中的经验与挑战。文章指出,未来的重心将从单纯训练模型“思考”转向训练智能体“边想边做…...

终极指南:如何彻底解决Colab运行text-generation-webui的Matplotlib后端错误

终极指南:如何彻底解决Colab运行text-generation-webui的Matplotlib后端错误 【免费下载链接】text-generation-webui The original local LLM interface. Text, vision, tool-calling, training, and more. 100% offline. 项目地址: https://gitcode.com/GitHub_…...

程序运行机制:编译、链接与装入详解

1. 程序运行的底层机制解析作为一名在嵌入式系统开发领域工作多年的工程师,我经常需要深入理解程序从源代码到最终执行的完整过程。这个看似简单的"程序运行"背后,实际上隐藏着编译、链接、装入这三个关键阶段。今天,我就结合自己的…...

shjshxksxjxbf

一、OpenAI 1.OpenAI是什么简单来说,OpenAI 大模型 是由美国人工智能公司 OpenAI 开发的一系列大型语言模型(LLMs) 。你可以把它们想象成拥有巨大“知识储备”和“学习能力”的超级大脑,它们被训练用来理解和生成人类语言&#xf…...

2026年3月上海污水处理设备生产厂家推荐:十大口碑产品评测对比知名

步入2026年3月,随着环保政策持续收紧与工业智能化升级的双重驱动,企业对污水处理设备的需求已从单纯的“达标排放”转向“高效、智能、全生命周期成本最优”。根据中国环保产业协会发布的《2026年度水处理装备市场趋势报告》,超过68%的采购决…...

【独家首发】基于eBPF+Java Agent+Istio Telemetry V2的零侵入式调试框架(已落地金融级生产环境,QPS>50K场景验证)

第一章:零侵入式调试框架的演进逻辑与金融级落地价值传统调试方式依赖代码埋点、日志增强或代理注入,不仅增加系统耦合度,更在高敏感、强一致性的金融核心系统中引入不可控风险。零侵入式调试框架应运而生——它不修改业务字节码、不依赖特定…...

Element Plus访问优化指南:从卡顿到流畅的开发体验提升方案

Element Plus访问优化指南:从卡顿到流畅的开发体验提升方案 【免费下载链接】element-plus 🎉 A Vue.js 3 UI Library made by Element team 项目地址: https://gitcode.com/GitHub_Trending/el/element-plus 在前端开发过程中,你是否…...

终极Windows驱动管家:DriverStore Explorer释放系统空间完全指南

终极Windows驱动管家:DriverStore Explorer释放系统空间完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 引言:被遗忘的驱动仓库 你是否曾疑惑为…...

突破方舟生存进化技术壁垒的智能管理工具

突破方舟生存进化技术壁垒的智能管理工具 【免费下载链接】TEKLauncher Launcher for ARK: Survival Evolved 项目地址: https://gitcode.com/gh_mirrors/te/TEKLauncher 你是否曾因MOD安装顺序错误导致游戏频繁崩溃?是否在搭建私人服务器时被端口配置弄得晕…...

告别GIL幻觉:基于subinterpreter+shared_memory的生产级无锁Pipeline(附GitHub星标1.2k的perf-validated模板库)

第一章:Python无锁GIL环境下的并发模型性能调优指南Python 的全局解释器锁(GIL)长期被视为 CPU 密集型并发的瓶颈,但现代 CPython 3.12 已实验性支持无 GIL 构建(通过 --without-pygil 配置选项)&#xff0…...

3DGS训练完模型怎么可视化?手把手教你用官方Viewer在Windows上查看结果

3DGS训练完模型怎么可视化?手把手教你用官方Viewer在Windows上查看结果 当你花费数小时甚至数天时间在Linux服务器上完成3D高斯泼溅(3DGS)模型的训练后,最令人兴奋的时刻莫过于亲眼看到自己的训练成果。本文将详细介绍如何将训练好的模型从Linux服务器迁…...

ostringstream清空缓存的正确姿势:str()与clear()的深度解析

1. 为什么ostringstream清空缓存这么让人困惑? 第一次用ostringstream的时候,我也被它坑过。记得当时写了个日志记录功能,反复往同一个ostringstream对象里写入内容,结果发现每次输出的日志都越积越长。我本能地调用了clear()&…...

嵌入式状态机设计与实现全解析

1. 嵌入式状态机基础概念状态机(State Machine)是嵌入式系统开发中最核心的设计模式之一,它通过定义系统可能处于的状态集合、状态之间的转换条件以及状态转换时执行的动作,为复杂系统行为建模提供了清晰框架。在嵌入式环境中&…...

【Skills开发实战指南】第01篇:Skills开发入门:AI助手的能力扩展革命

快速导航 读完本文,你将获得: ✅ 深入理解Skills是什么以及为什么需要它✅ 掌握Skills在AI编程工具中的核心价值✅ 了解Skills的完整生态和应用场景✅ 明确Skills开发的学习路径和资源✅ 准备好开始你的第一个Skills开发项目 一、Skills是什么&#xf…...

【系统架构设计师-案例题(5)】人工智能 · 参考答案与解析(按分类)

文章目录目录一、机器学习基本概念单选 迁移学习单选 强化学习的核心特点二、人工智能分类(弱人工智能与强人工智能)单选 主要区别三、人工智能关键技术单选 说法错误项(选非)单选 哪项不是人工智能关键技术(选非…...

TDAD:测试驱动的AI智能体开发

Test-Driven AI Agent Definition (TDAD) 论文核心原理解析与实例说明 TDAD 提示词演化逻辑与完整实例 TDAD的提示词演化,完全遵循测试驱动的闭环迭代逻辑:由TestSmith生成的visible tests(可见测试用例)作为唯一迭代标尺,PromptSmith智能体通过「失败用例根因分析→提示…...

3D Face HRN开源镜像:ModelScope官方cv_resnet50_face-reconstruction部署

3D Face HRN开源镜像:ModelScope官方cv_resnet50_face-reconstruction部署 1. 引言:从2D照片到3D人脸的魔法转换 你是否曾经想过,仅仅通过一张普通的2D人脸照片,就能生成精确的3D人脸模型?这在过去可能需要专业设备和…...