
是思成呀:个人主页
目录
[一、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 UNCOMMITTED → READ COMMITTED → REPEATABLE READ → SERIALIZABLE,级别越高,数据一致性越强,并发性能越差,精简后 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 技术体系!