事务隔离级别有哪些?MySQL 的默认隔离级别是什么
# 1. 事务隔离级别的定义
事务隔离级别是 “数据库解决并发事务冲突的规则”,通过限制事务对数据的可见性,避免脏读、不可重复读、幻读等并发异常,MySQL 支持 4 种隔离级别(按严格程度从低到高排序)。
# 2. 4 种事务隔离级别详解
| 隔离级别 | 核心定义 | 并发异常情况 | 适用场景 |
|---|---|---|---|
| 读未提交(Read Uncommitted) | 事务 A 可读取事务 B 未提交的修改数据 | 允许脏读、不可重复读、幻读 | 极少使用(如对数据一致性无要求的临时查询) |
| 读已提交(Read Committed,RC) | 事务 A 只能读取事务 B 已提交的修改数据 | 禁止脏读,允许不可重复读、幻读 | 多数互联网场景(如电商商品查询、新闻浏览) |
| 可重复读(Repeatable Read,RR) | 事务 A 在事务内多次读取同一数据,结果一致(无论其他事务是否修改并提交) | 禁止脏读、不可重复读,默认禁止幻读 | 金融、电商订单等对一致性要求高的场景 |
| 串行化(Serializable) | 事务串行执行(一个事务完成后,另一个事务才开始),完全隔离 | 禁止所有并发异常 | 数据一致性要求极高的场景(如银行转账) |
# 3. 各隔离级别的并发异常示例
- 脏读:仅读未提交级别允许。事务 B 修改数据未提交,事务 A 读取该数据,事务 B 回滚后,事务 A 读取的是 “脏数据”。
- 不可重复读:读未提交、读已提交级别允许。事务 A 两次读取同一数据,事务 B 在期间修改并提交,导致两次读取结果不一致。
- 幻读:读未提交、读已提交级别允许;可重复读级别默认禁止(InnoDB 通过间隙锁实现);串行化级别禁止。事务 A 两次查询同一范围数据,事务 B 在期间插入 / 删除数据并提交,导致两次结果集行数不一致。
# 4. MySQL 的默认隔离级别
MySQL 的默认隔离级别是可重复读(RR),这是 InnoDB 存储引擎的默认配置;
与其他数据库(如 PostgreSQL、Oracle)默认 “读已提交(RC)” 不同,MySQL 的 RR 级别通过 MVCC(多版本并发控制)+ 间隙锁,实现了 “默认禁止幻读”,兼顾了一致性和并发性能;
可通过以下命令查看和修改隔离级别:
-- 查看当前会话隔离级别 SELECT @@session.tx_isolation; -- 修改当前会话隔离级别为读已提交 SET session tx_isolation = 'READ-COMMITTED'; -- 查看全局隔离级别 SELECT @@global.tx_isolation; -- 修改全局隔离级别(需重启会话生效) SET global tx_isolation = 'REPEATABLE-READ';1
2
3
4
5
6
7
8
上次更新: 12/30/2025