MySQL事务隔离级别详解与区别
MySQL InnoDB支持哪四种事务隔离级别?各隔离级别分别解决什么问题(脏读、不可重复读、幻读)?MySQL默认隔离级别是什么?如何选择合适级别?
回答
苦行僧
四种隔离级别(由低到高):
-
READ UNCOMMITTED(读未提交)
- 一个事务能读到另一个事务未提交的数据
- 问题:脏读、不可重复读、幻读
- 几乎不用
-
READ COMMITTED(读已提交) — Oracle默认
- 只能读到已提交的数据
- 问题:不可重复读(同一事务两次读同一行结果不同)、幻读
- 实现:每次查询都生成一个新的ReadView
-
REPEATABLE READ(可重复读) — MySQL默认
- 同一事务多次读同一行结果一致
- 问题:幻读(理论上存在,但InnoDB通过间隙锁解决)
- 实现:事务开始时生成ReadView,整个事务期间复用
-
SERIALIZABLE(可序列化)
- 所有事务串行执行
- 问题:性能最低,大量锁竞争
- 实现:所有读操作加锁(共享锁)
总结:MySQL默认RR级别,通过MVCC+间隙锁解决了幻读问题,实际使用中RR和RC最常用。RC相比RR有更少的间隙锁冲突,但可能出现不可重复读。