题目:MySQL 中的事务隔离级别?
难度:medium
标签:db/mysql/concepts, mysql/isolation, mysql/transaction, difficulty/medium
评分:⭐⭐⭐☆(3/5)
事务隔离级别主要有四种,读未提交、读已提交、重复读和串行化。这个等级隔离级别的限制条件从低到高。最低的读未提交是没有任何事务方面的限制,大家可以读到所有更新的数据,不管事务有没有提交,这时候会存在大量的事务方面的问题,但是效率是最高的。读已提交相对的事务隔离级别高一些,只会读到其他事务提交过的内容,但是也会在事务中会受到其他事务的影响,这时候不会出现脏读,也就是说不会出现读到未提交的内容。处理了脏读,然后可重复读。重复读这块处理的,其实面对的是其他事务提交了,但是其实本质那些事务提交的不应该影响当前事务。这时候它事务第一个 SQL 执行的查询,查到结果跟底下查询的结果可能不一致。可重复读就是应对这种问题,它保证通过 MVCC 的镜像机制,保证当前事务第一次查询跟其他次数查询得到结果是一样的,通过快照机制。但是会可能涉及一个衍生的问题,就是其他数据创建、删除,这时候会导致还是会影响查询数据,这时候就需要串行化。如果最强一致性要求就串行化,串行化了会导致整个锁起来,这个执行完,其他的事务才能执行。保证了完整的数据窗口,但是它的效率太低了。
优点:
不足:
补充:
核心考点定位:掌握四种隔离级别的定义、解决的读异常、锁机制差异、MySQL 特殊行为。
知识点拆解:
SELECT FOR UPDATE / UPDATE / DELETE):大部分解决。通过 next-key lock 锁住相关行和间隙WHERE 匹配范围 + 其他事务 INSERT 新行,再回当前事务查,可能看到"新行"(幻读)SELECT FOR UPDATE,B 期间 INSERT → 当前读看到 B 插入的新行(幻读)WHERE id > ?,B 在间隙里 INSERT → 当前读看到新行(幻读,如果间隙锁没覆盖)SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;START TRANSACTION ISOLATION LEVEL READ COMMITTED;SELECT @@transaction_isolation;考察方向:
延伸递进面试题:
SELECT FOR UPDATE NOWAIT 在 RR 下会加什么锁?面试官您好,MySQL 的四种隔离级别我按从低到高讲。
READ UNCOMMITTED(读未提交):能读到其他事务未提交的数据,最容易出问题但效率最高,实际几乎不用。
READ COMMITTED(读已提交):只能读到其他事务提交后的数据,解决了脏读。Oracle 默认就是这个级别。RC 的特点是每个 SQL 查询都重新生成一个 ReadView,所以事务里如果其他事务提交了,我下一个查询就能看到。RC 只有行锁,没有间隙锁,死锁概率低,很多互联网公司生产用 RC。
REPEATABLE READ(可重复读):同一事务内多次查询结果一致。MySQL 默认是 RR。核心机制是事务第一次查询时生成一个 ReadView,事务期间一直复用,所以看不到其他事务期间提交的改动。RR 的锁机制是 next-key lock,也就是行锁加间隙锁,主要用来防幻读。
关于幻读,很多人误以为 RR 完全解决了,其实不然。快照读的普通 SELECT 不受 next-key lock 保护,只能靠 ReadView 挡住一部分。真正会触发幻读的场景是快照读和当前读混用——事务 A 先普通 SELECT,然后 SELECT FOR UPDATE,如果事务 B 在中间 INSERT 了新行,A 的当前读就会看到 B 刚插入的数据。另外范围查询时如果间隙锁没覆盖到位,也可能看到新行。
SERIALIZABLE(串行化):所有 SELECT 隐式加 S 锁,写入加 X 锁,事务完全串行执行。一致性最强,但并发度极低,生产很少用。
隔离级别切换可以用 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; 改会话,或者 START TRANSACTION ISOLATION LEVEL READ COMMITTED; 只在单个事务生效。
选择上我一般是这样考虑的:如果业务不需要可重复读的一致性,且想降低锁冲突,选 RC 就好;如果业务需要保证事务内的读取稳定,选 RR,但要接受间隙锁带来的死锁和锁等待风险;只有强一致场景(比如金融支付)才考虑 Serializable。
https://chat.deepseek.com/share/kvxo4aw3f312vm6wos