MySQL 事务隔离级别
type
status
date
slug
summary
tags
category
icon
password
一、事务基础概念
- 针对写操作
1.1 事务的基本操作
1.2 ACID 特性
特性 | 说明 | 实现机制 |
原子性 (Atomicity) | 事务中的所有操作要么全部完成,要么全部不完成 | Undo Log |
一致性 (Consistency) | 事务必须使数据库从一个一致性状态变换到另一个一致性状态 | 应用层+数据库约束 |
隔离性 (Isolation) | 并发事务之间互不干扰 | 锁机制+MVCC |
持久性 (Durability) | 事务提交后,对数据的修改是永久性的 | Redo Log |
二、事务并发问题
2.1 三种典型并发问题
问题类型 | 现象描述 | 示例场景 |
脏读 (Dirty Read) | 读取到其他事务未提交的数据 | 事务A读取了事务B修改但未提交的数据,事务B回滚后数据不一致 |
不可重复读 (Non-repeatable Read) | 同一事务内多次读取同一数据结果不一致 | 事务A读取数据后,事务B修改并提交了该数据,事务A再次读取发现值变了 |
幻读 (Phantom Read) | 同一事务内多次查询返回的记录数不一致 | 事务A查询符合条件的数据后,事务B插入新数据并提交,事务A再次查询发现多了一条记录 |
三、MySQL 事务隔离级别
3.1 四种隔离级别对比
隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 | 使用场景 |
读未提交 (READ UNCOMMITTED) | ❌ 可能 | ❌ 可能 | ❌ 可能 | 最高 | 数据准确性要求极低,如监控统计 |
读已提交 (READ COMMITTED) | ✅ 避免 | ❌ 可能 | ❌ 可能 | 较高 | Oracle默认,适合大多数OLTP系统 |
可重复读 (REPEATABLE READ) | ✅ 避免 | ✅ 避免 | ❌ 可能 | 中等 | MySQL默认,需要数据一致性 |
串行化 (SERIALIZABLE) | ✅ 避免 | ✅ 避免 | ✅ 避免 | 最低 | 金融交易等严格要求一致性的场景 |
3.2 查看和设置隔离级别
重要修正:MySQL 8.0 中 tx_isolation 变量已更名为 transaction_isolation
四、各隔离级别详细测试
4.1 读未提交 (READ UNCOMMITTED) - 修正示例
测试准备:
测试过程:
4.2 读已提交 (READ COMMITTED)
测试过程:
4.3 可重复读 (REPEATABLE READ) - MySQL默认
测试过程:
4.4 串行化 (SERIALIZABLE)
测试过程:
五、MVCC(多版本并发控制)
5.1 MVCC 工作原理
MySQL InnoDB 通过以下机制实现MVCC:
- 每行数据有隐藏的
DB_TRX_ID(事务ID)和DB_ROLL_PTR(回滚指针)
- ReadView 机制决定事务能看到哪个版本的数据
- Undo Log 存储数据的历史版本
5.2 MVCC 与隔离级别的关系
隔离级别 | SELECT操作类型 | 锁机制 |
READ COMMITTED | 每次创建新ReadView | 记录锁 |
REPEATABLE READ | 第一次创建ReadView | 记录锁+间隙锁 |
六、实际应用建议
6.1 隔离级别选择指南
- 金融系统:SERIALIZABLE 或 REPEATABLE READ + 应用层控制
- 电商平台:READ COMMITTED 或 REPEATABLE READ
- 报表系统:READ UNCOMMITTED(仅查询)
- 一般应用:使用默认的 REPEATABLE READ
6.2 性能优化建议
6.3 死锁处理
七、总结对比表
特性 | READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE |
脏读 | 可能 | 避免 | 避免 | 避免 |
不可重复读 | 可能 | 可能 | 避免 | 避免 |
幻读 | 可能 | 可能 | 可能* | 避免 |
性能 | 最佳 | 良好 | 好 | 差 |
并发性 | 最高 | 高 | 中等 | 低 |
*注:MySQL的REPEATABLE READ通过MVCC部分避免了幻读,但某些情况下仍可能出现
Loading...