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 隔离级别选择指南

  1. 金融系统:SERIALIZABLE 或 REPEATABLE READ + 应用层控制
  1. 电商平台:READ COMMITTED 或 REPEATABLE READ
  1. 报表系统:READ UNCOMMITTED(仅查询)
  1. 一般应用:使用默认的 REPEATABLE READ

6.2 性能优化建议

6.3 死锁处理

七、总结对比表

特性
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
脏读
可能
避免
避免
避免
不可重复读
可能
可能
避免
避免
幻读
可能
可能
可能*
避免
性能
最佳
良好
并发性
最高
中等
*注:MySQL的REPEATABLE READ通过MVCC部分避免了幻读,但某些情况下仍可能出现
Loading...