MySQL 隔离级别
SQL标准定义了四个隔离级别:读未提交、读已提交、可重复读和串行化。这四个级别主要是为了解决并发事务中可能出现的脏读、不可重复读和幻读等问题。而MySQL默认的隔离级别是可重复读。
读未提交是最低的级别,可能允许脏读,也就是一个事务可以读到另一个未提交事务的修改。
读已提交解决了脏读,但可能还存在不可重复读的问题,比如同一事务两次读取同一数据可能结果不同。
可重复读解决了不可重复读,但在标准中可能允许幻读,不过MySQL通过MVCC在可重复读级别下避免了幻读
串行化通过锁机制彻底避免所有并发问题,但性能开销最大
1. 读未提交(Read Uncommitted)
特点:事务可以读取其他事务未提交的修改(脏读)。
允许的问题:
脏读(可能读到未提交的无效数据)
不可重复读(同一事务多次读取同一数据结果不同)
幻读(同一查询返回不同行数)
适用场景:对数据一致性要求极低,追求高并发性能的场景(极少使用)。
2. 读已提交(Read Committed)
特点:事务只能读取其他事务已提交的修改。
解决的问题:脏读。
允许的问题:
不可重复读(同一事务多次读取同一数据可能不同,因其他事务已提交修改)
幻读(其他事务插入或删除行导致结果集变化)
实现机制:通过 MVCC(多版本并发控制)或行锁实现。
适用场景:大多数数据库的默认级别(如 Oracle),适合需要平衡一致性和性能的场景。
3. 可重复读(Repeatable Read)
特点:事务内多次读取同一数据的结果一致,即使其他事务提交修改。
解决的问题:脏读、不可重复读。
允许的问题:
幻读(根据 SQL 标准允许,但 MySQL 通过 MVCC 和 Next-Key 锁避免了幻读)
实现机制:
MySQL 默认隔离级别。
使用 MVCC 在事务开始时创建一致性快照。
通过 Next-Key 锁(行锁 + 间隙锁)防止其他事务插入新行。
适用场景:需要事务内数据一致性(如金融系统)。
4. 串行化(Serializable)
特点:强制事务串行执行,完全隔离。
解决的问题:脏读、不可重复读、幻读。
实现机制:通过严格的锁机制(如范围锁)阻塞并发操作。
缺点:性能开销最大,并发度最低。
适用场景:严格要求数据一致性,可接受低并发的场景。
对比表格
注意事项
MySQL 在「可重复读」级别下通过 Next-Key 锁避免了幻读(与 SQL 标准不同)。
幻读的解决依赖于具体实现,其他数据库(如 PostgreSQL)的「可重复读」可能允许幻读。
简单总结
选择隔离级别需权衡数据一致性与并发性能
MySQL 默认的「可重复读」在多数场景下平衡较好,而「串行化」仅在极端一致需求时使用。