MySQL事务隔离级别按严格性递增分为READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE,分别容忍脏读、不可重复读、幻读的程度不同,核心在于MVCC与锁机制的协同实现。
MySQL 的事务隔离级别决定了一个事务能看到其他并发事务的哪些修改,直接影响数据一致性、并发性能和锁行为。核心区别在于对“脏读”“不可重复读”“幻读”这三类并发问题的容忍程度。
READ UNCOMMITTED(读未提交)
最低隔离级别,事务可以读取其他事务尚未提交的数据。
- 允许脏读:比如事务 A 修改了某行但未提交,事务 B 此时能读到这个“脏”值;若 A 回滚,B 就读到了不存在的数据
- 不加行级读锁,写操作仍需加行锁(如 UPDATE),但读不阻塞写,写也不阻塞读
- 实际生产极少使用,仅在对一致性要求极低、追求极致吞吐的场景(如日志统计临时分析)中偶见
READ COMMITTED(读已提交)
Oracle 默认级别,MySQL 在开启 innodb_read_committed 或使用一致性非锁定读(consistent non-locking read)时生效(需配合 MVCC)。
- 避免脏读:只能读到已提交事务的数据
- 仍可能发生不可重复读:同一事务内多次 SELECT 同一行,可能因其他事务中途提交更新而得到不同结果
- 每次 SELECT 都会生成新快照(基于语句执行时刻的已提交版本),不复用事务开始时的快照
- InnoDB 中,普通 SELECT 不加锁,UPDATE/DELETE 仍按需加行锁
REPEATABLE READ(可重复读)
MySQL InnoDB 默认隔离级别,通过 MVCC + Next-Key Lock 实现较强一致性保障。