【MySQL 零基础入门】事务精讲(三):隔离级别与实战总结

是思成呀:个人主页

个人专栏《C++知识总结》《MySQL 零基础入门到实战》


目录

[一、MySQL 的四种事务隔离级别](#一、MySQL 的四种事务隔离级别)

二、隔离级别的配置与验证(精简实战)

[1. 查看当前隔离级别](#1. 查看当前隔离级别)

[2. 设置隔离级别](#2. 设置隔离级别)

[3. 实战验证:REPEATABLE READ 解决不可重复读](#3. 实战验证:REPEATABLE READ 解决不可重复读)

三、事务知识全总结

[1. 核心概念](#1. 核心概念)

[2. 四大特性(ACID)](#2. 四大特性(ACID))

[3. 并发问题与隔离级别](#3. 并发问题与隔离级别)

[4. 实战建议](#4. 实战建议)

[四、MySQL 基础篇总结](#四、MySQL 基础篇总结)

结尾


引言

并发事务的脏读、不可重复读、幻读问题,本质是 "隔离性" 没做到位 ------ 而事务隔离级别,就是调整隔离性强弱的 "开关":调得太松,高中生数据不安全(如读到未提交的缴费记录);调得太紧,性能又差(如多个高中生同时缴费时排队)。MySQL 提供了四种隔离级别,从低到高覆盖不同场景需求。本文带你吃透每一种隔离级别的效果、配置方法,结合高中生缴费的实战验证隔离级别如何解决并发问题,最后对事务知识做全面总结!


一、MySQL 的四种事务隔离级别

隔离级别从低到高依次为:READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE,级别越高,数据一致性越强,并发性能越差,精简后 5 名学生的场景更易验证:

隔离级别 脏读 不可重复读 幻读 对高中教务场景的影响(精简版)
read uncommitted 读取到林墨涵未提交的缴费数据,误判余额不足
read committed 避免脏读,但查询余额 > 2000 的学生结果不一致
repaetable read 保证同一事务内查询结果一致,MySQL 默认
serializable 林墨涵缴费时阻塞其他操作,数据绝对安全但并发低

二、隔离级别的配置与验证(精简实战)

1. 查看当前隔离级别

sql 复制代码
-- 查看会话级隔离级别(仅当前窗口有效)
SELECT @@transaction_isolation;

-- 查看全局级隔离级别(对所有新会话有效)
SELECT @@global.transaction_isolation;

2. 设置隔离级别

sql 复制代码
-- 会话级设置(仅当前窗口有效)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 全局级设置(需重启会话生效)
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

3. 实战验证:REPEATABLE READ 解决不可重复读

以高中生林墨涵的账户余额为例,验证可重复读的效果:

会话 A:开启事务,查询林墨涵余额

sql 复制代码
START TRANSACTION;
SELECT balance FROM student_account WHERE student_name = '林墨涵';  -- 结果:2000

会话 B:更新林墨涵余额并提交(模拟其他事务缴费操作)

sql 复制代码
UPDATE student_account SET balance = 500 WHERE student_name = '林墨涵';
COMMIT;

会话 A:再次查询林墨涵余额

sql 复制代码
SELECT balance FROM student_account WHERE student_name = '林墨涵';  -- 结果仍为2000(可重复读)
COMMIT;  -- 提交后查询,结果变为500

结论 :在 REPEATABLE READ 级别下,同一事务内多次读取数据结果一致,避免了不可重复读问题。

三、事务知识全总结

1. 核心概念

  • 事务是一组不可分割的操作集合,要么全部成功,要么全部失败;
  • 手动控制事务的三步:START TRANSACTION(开启)→ 执行操作(如高中生缴费)→ COMMIT/ROLLBACK(提交 / 回滚)。

2. 四大特性(ACID)

  • 原子性:操作不可分割(如缴费的扣余额和更状态必须同时完成);
  • 一致性:数据逻辑不变(如高中生缴费前后余额 + 缴费状态逻辑一致);
  • 隔离性:事务相互隔离(如多个高中生缴费事务互不干扰);
  • 持久性:修改永久保存(缴费记录提交后不会因服务器崩溃丢失)。

3. 并发问题与隔离级别

  • 并发问题:脏读(读未提交的高中生余额)、不可重复读(同一事务内高中生余额变化)、幻读(新增高中生记录导致结果行数变化);
  • 隔离级别:MySQL 默认 REPEATABLE READ,兼顾一致性和性能;
  • 选型原则:根据业务需求选择隔离级别(如学费结算用 SERIALIZABLE,普通成绩查询用默认级别)。

4. 实战建议

  • 避免长事务:长事务会占用锁资源,降低并发性能(如处理高中生数据时拆分事务);
  • 合理处理异常:事务内出现错误时,必须执行 ROLLBACK(如缴费失败时回滚余额扣减);
  • 慎用串行化:仅在核心业务场景使用,避免性能瓶颈(如非核心的高中生信息修改无需串行化)。

四、MySQL 基础篇总结

至此,MySQL 基础篇的核心知识点已全部讲解完毕,掌握这些内容后,你已具备开发中小型教务系统的数据库能力,足以应对 80% 的场景需求,后续进阶篇将深入讲解 SQL 优化、分库分表、数据库运维等内容。

建议通过实战项目(如高中生选课系统、成绩管理系统)巩固知识点,将理论转化为实践!

结尾

🍍 我是思成!若这篇内容帮你理清了 MySQL 事务隔离级别与实战总结的核心逻辑:

👀 【关注】跟我一起拆解 MySQL 核心知识点,从隔离级别到性能优化,吃透每一个事务实战规则

❤️ 【点赞】让技术干货被更多人看见,让抽象的隔离级别选择逻辑变得易懂

⭐ 【收藏】把四种隔离级别、高中生数据实战验证方法存好,事务调优 / 面试时随时查阅

💬 【评论】分享你为高中生系统选择事务隔离级别的经验,或想深挖的 MySQL 知识点,一起交流进步

技术学习没有捷径,但找对思路能少走弯路~愿我们都能把抽象的事务隔离规则,转化为可落地的并发控制方案,一步步构建自己的 MySQL 技术体系!

相关推荐
num_killer18 分钟前
小白的Langchain学习
java·python·学习·langchain
2501_9481953430 分钟前
RN for OpenHarmony英雄联盟助手App实战:主导航实现
数据库
Filotimo_1 小时前
N+1查询问题
数据库·oracle
wdfk_prog1 小时前
[Linux]学习笔记系列 -- hashtable
linux·笔记·学习
a程序小傲1 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
fenglllle2 小时前
spring-data-jpa saveall慢的原因
数据库·spring·hibernate
DarkAthena3 小时前
【GaussDB】执行索引跳扫时如果遇到该索引正在执行autovacuum,可能会导致数据查询不到
数据库·gaussdb
短剑重铸之日3 小时前
《7天学会Redis》Day 5 - Redis Cluster集群架构
数据库·redis·后端·缓存·架构·cluster
007php0073 小时前
mySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据
数据库·redis·git·mysql·面试·职场和发展·php