MySQL 事务隔离级别
时间:2026-10-7 07:21 作者:emer 分类: 无
MySQL 事务隔离级别
事务是数据库的重要特性,隔离级别决定了事务之间互相影响的程度。这篇讲清楚四个隔离级别。
1. 事务的 ACID 特性
- 原子性(Atomicity): 事务要么全部成功,要么全部失败
- 一致性(Consistency): 事务前后数据库状态一致
- 隔离性(Isolation): 多个事务之间互不干扰
- 持久性(Durability): 事务提交后永久保存
2. 三个并发问题
脏读: 一个事务读到另一个事务还没提交的数据
不可重复读: 同一个事务内,两次读同一行数据结果不一样(被别的事务修改了)
幻读: 同一个事务内,两次查询返回的行数不一样(被别的事务插入/删除了)
3. 四个隔离级别
1)读未提交(Read Uncommitted)
- 最低级别,能读到未提交的数据
- 会出现脏读、不可重复读、幻读
2)读提交(Read Committed)
- 只能读到已提交的数据
- 解决脏读,但还有不可重复读、幻读
- Oracle 默认级别
3)可重复读(Repeatable Read)
- 同一个事务内多次读同一行结果一致
- 解决脏读、不可重复读,但还有幻读
- MySQL InnoDB 默认级别
4)串行化(Serializable)
- 最高级别,事务串行执行
- 解决所有问题,但性能最差
4. 查看和设置
-- 查看当前隔离级别
SELECT @@transaction_isolation;
-- 设置隔离级别(会话级别)
SET SESSION transaction_isolation = 'READ-COMMITTED';
-- 设置全局隔离级别
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
5. InnoDB 的优化
MySQL InnoDB 在可重复读级别下,通过 MVCC(多版本并发控制)和间隙锁,也解决了幻读问题,比标准 SQL 定义的更强。
6. 实际开发怎么选
- 大多数场景用默认的可重复读就够了
- 对一致性要求极高的场景(金融),用串行化
- 报表分析等读多写少的场景,可以调低到读提交提高性能
总结
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 |
|---|---|---|---|---|
| 读未提交 | 有 | 有 | 有 | 最好 |
| 读提交 | 无 | 有 | 有 | 好 |
| 可重复读 | 无 | 无 | 无(InnoDB) | 一般 |
| 串行化 | 无 | 无 | 无 | 最差 |
MySQL 默认可重复读,日常开发不用改,理解原理就行。