MySQL支持四种事务隔离级别:读未提交、读已提交、可重复读和串行化。通过设置不同级别并测试并发操作,可观察脏读、不可重复读与幻读现象。读未提交允许脏读;读已提交避免脏读但存在不可重复读;可重复读利用MVCC和间隙锁防止不可重复读和部分幻读;串行化完全串行执行,杜绝并发问题但性能最低。实际测试建议使用双会话对比查询结果变化,权衡一致性与性能后选择合适级别。

在 MySQL 中,事务隔离级别决定了事务之间的可见性和并发行为。理解不同隔离级别的差异,能帮助你优化数据一致性与系统性能。MySQL 支持四种标准的事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。通过实际测试可以直观比较它们的行为差异。
查看和设置隔离级别
你可以使用以下命令查看当前会话或全局的隔离级别:
SHOW VARIABLES LIKE 'transaction_isolation';要设置当前会话的隔离级别,例如设为“读已提交”:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;常用选项包括:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ(MySQL 默认)
- SERIALIZABLE
比较脏读现象
脏读是指一个事务读取了另一个未提交事务的数据。这种现象只会在 READ UNCOMMITTED 级别下出现。
测试方法:
- 会话 A 开启事务并更新一行数据但不提交
- 会话 B 在 READ UNCOMMITTED 级别下查询该行,能看到未提交的值
- 若会话 A 回滚,会话 B 读到的就是“脏”数据
在其他隔离级别中,会话 B 会等待或读取旧版本数据,避免脏读。
比较不可重复读和幻读
不可重复读指同一事务内多次读取同一行,结果不一致(因其他事务修改并提交)。幻读则是指前后两次查询范围条件的结果集数量不同(因其他事务插入或删除)。
表现差异:
- READ COMMITTED:防止脏读,但可能出现不可重复读和幻读
- REPEATABLE READ:通过多版本并发控制(MVCC)保证同一事务中读取一致,防止不可重复读;MySQL 特殊实现也一定程度防止幻读(间隙锁)
- SERIALIZABLE:强制事务串行执行,完全避免上述问题,但并发性最差
实际测试建议
进行对比时,建议使用两个客户端会话模拟并发操作。
示例步骤:
- 创建一张测试表:CREATE TABLE test (id INT, value INT)
- 会话 A 开启事务并查询某行
- 会话 B 修改或插入数据并提交
- 会话 A 再次查询,观察结果是否变化
- 更换隔离级别重复测试
重点关注:是否读到新数据、是否阻塞、是否报错。
基本上就这些。通过控制变量法逐一测试,你能清楚看到每个隔离级别的行为边界。选择时权衡一致性和性能即可。










