523 字
3 分钟
面试鸭-MySQl中事务的隔离级别有哪些?

MySQl中事务的隔离级别有哪些?#

有四种隔离级别,分别是读未提交、读已提交、可重复读、串行化。 读未提交:事务能看到别的事务还未提交的数据,完全不考虑事务隔离,很可能出现脏读和幻读问题。 读已提交:事务只能看到别的事务已提交的数据,不回出现脏读问题,但是重复读得到的结果可能会不一样,不可重复读,有幻读问题。 可重复读:在读数据的时候创建一个快照,接下来之后的每次读取都从这个快照上去读取,没有脏读问题,但是可能出现幻读。 串行化:直接放弃并行事务,只允许串行执行事务,没有脏读幻读问题,但是性能很差。

问题#

如果我把隔离级别从可重复读调成读已提交,业务代码需要注意什么?#

主要要考虑两点问题:

  1. 读已提交事务重复读同一行数据得到的结果可能会不同,需要考虑业务是否有这个需求。
  2. 读已提交没有间隙锁,UPDATE和DELETE的锁范围比较小,业务代码要考虑是否会出现幻读等问题。

可重复读级别下两个事务同时 SELECT … FOR UPDATE 同一行,会怎么样?#

先执行的事务会持有锁,正常执行,后一个事务需要等锁释放,进入阻塞等待状态。如果两个事务都持有对方等待的锁,就会出现死锁,会触发死锁检测,InnoDB会回滚代价小的那个事务,另一个就可以继续执行。

读未提交这个级别有什么实际使用场景吗?#

很少,但是也有。比如做大批量数据统计的离线任务,只需要知道大概数字,对数据一致性要求不高,就可以用这个级别。但是一般生产环境都不用这个级别,风险太高了。

面试鸭-MySQl中事务的隔离级别有哪些?
http://www.shineacz.top/posts/面试鸭-mysql中事务的隔离级别有哪些/
作者
shineAcZ
发布于
2026-03-15
许可协议
CC BY 4.0